2015-12-03 64 views
1

我想刪除NaN值並按row.names排序。我試圖使用dplyr來做到這一點,但我的嘗試沒有奏效。有人可以提出一種解決方法嗎?使用dplyr刪除NaN

require(markovchain) 
data1<-data.frame(dv=rep(c("low","high"),3),iv1=sample(c("A","B","C"),replace=T,6)) 
markov<-markovchainFit(data1) 
markovDF<-as(markov, "data.frame") 
library(dplyr) 
markovDF%>%filter(rowSums>0)%>%arrange(desc(markovDF[,1])) 


> markov 
$estimate 
      A   B   C high low 
A   NaN  NaN  NaN NaN NaN 
B   NaN  NaN  NaN NaN NaN 
C   NaN  NaN  NaN NaN NaN 
high 0.3333333 0.0000000 0.6666667 0 0 
low 0.6666667 0.3333333 0.0000000 0 0 

目標:

 A B C high low 
high .33 .00 .67 0 0 
low .67 .33 .00 0 0 
+0

你能在你的例子使用「set.seed」,以便它可以重現? – Nelson

+0

你也應該分享你得到的錯誤信息。 – 2015-12-03 05:44:20

回答

2

似乎nelsonauner的回答改變了row.names屬性解決這個問題。因爲你想排序row.names這似乎是一個問題。

你不需要dplyr這樣做:

library(markovchain) 
data1 <- data.frame(dv=rep(c("low","high"),3),iv1=sample(c("A","B","C"),replace=T,6)) 
markov<-markovchainFit(data1) 

#Get into dataframe 
markov <- as.data.frame([email protected]) 

#Remove rows that contain nans 
markov <- markov[complete.cases(markov), ] 

#sort by rowname 
markov <- markov[order(row.names(markov)),] 

      A   B   C high low 
high 0.0000000 0.3333333 0.6666667 0 0 
low 0.3333333 0.3333333 0.3333333 0 0 
+0

大量使用'complete.cases'! – Nelson

1

有兩個問題需要解決在這裏。

  1. dplyr是爲了在dataframes操作,所以我們需要將數據放在一個數據幀。你試圖用markovDF<-as(markov, "data.frame")做到這一點,但我無法得到這個工作。 (你得到一個非空數據幀?)

  2. NaN刪除行中的特定行(我會用排A,你可以改變它包括所有的行,如果你想)

您可以

> [email protected] %>% 
    as.data.frame %>% 
    dplyr::filter(!is.na(A)) 
    %>% arrange(-A) 


      A   B   C high low 
1 0.3333333 0.3333333 0.3333333 0 0 
2 0.0000000 0.6666667 0.3333333 0 0