2016-04-04 27 views
2

我在R中有一個數據幀矩陣,我希望按列的順序降序排列。我的數據從+1到-1的值不等。我有這樣的代碼,這是否很完美:在R中使用order(colSums())

DF<-DF[, order(colSums(-DF))] 

不過,我確實有一些NA值攤開數據之間(沒有單一的列或行是所有NA,所以我不能簡單地刪除整列或行) 。我相信數據沒有被正確排序,因爲包含NAs的列沒有排序,只是放置在排序列後面。

有沒有一種方法來按上述順序排列數據,還允許使用NAs對列進行排序?

+0

是的,你可以看看'order(c(1,NA,3,NA))'並且看到NAs確實分配了最後的命令。要修改它,可以使用'?order'中提到的'na.last'選項。 '?colSums'表明它有一個你可能想要的'na.rm'選項。順便說一下,[dataframes]是R.的錯誤標籤。 – Frank

回答

4

如果我的理解正確,您想在「非NA列」後面排列「NA列」,但是您還想根據應用於非NA的colSums()的結果對NA列進行排序NA列中的細胞。您可以使用order()的附加參數來執行此操作,以打破colSums()與其他參數na.rm=TRUE的聯繫。這裏有一個演示用4列,共計2來港,2無:

set.seed(3L) 
df <- setNames(rev(as.data.frame(replicate(4L, 
    sample(c(seq(-1,1,0.5),NA), 
      5L,rep=TRUE)))),letters[1:4]) 
df ## columns a and b are "NA columns", columns c and d are "non-NA columns" 
##  a b c d 
## 1 1.0 0.5 0.5 -0.5 
## 2 -1.0 0.5 -1.0 1.0 
## 3 1.0 0.5 -0.5 0.0 
## 4 NA 0.5 0.5 -0.5 
## 5 -0.5 NA 0.5 0.5 
colSums(-df) ## d should be moved before c, but can't tell yet about a and b 
## a b c d 
## NA NA 0.0 -0.5 
colSums(-df,na.rm=TRUE) ## this can tiebreak a and b; b should be moved before a 
## a b c d 
## -0.5 -2.0 0.0 -0.5 
df[,order(colSums(-df))] ## fails to order NA columns 
##  d c a b 
## 1 -0.5 0.5 1.0 0.5 
## 2 1.0 -1.0 -1.0 0.5 
## 3 0.0 -0.5 1.0 0.5 
## 4 -0.5 0.5 NA 0.5 
## 5 0.5 0.5 -0.5 NA 
df[,order(colSums(-df),colSums(-df,na.rm=TRUE))] ## tiebreaker orders NA columns properly 
##  d c b a 
## 1 -0.5 0.5 0.5 1.0 
## 2 1.0 -1.0 0.5 -1.0 
## 3 0.0 -0.5 0.5 1.0 
## 4 -0.5 0.5 0.5 NA 
## 5 0.5 0.5 NA -0.5 

對不起,我誤會了。看起來這是你要找的東西:

df[,order(colSums(-df,na.rm=TRUE))] 
##  b a d c 
## 1 0.5 1.0 -0.5 0.5 
## 2 0.5 -1.0 1.0 -1.0 
## 3 0.5 1.0 0.0 -0.5 
## 4 0.5 NA -0.5 0.5 
## 5 NA -0.5 0.5 0.5 

注意,通過na.rm=TRUE相當於治療來港定居爲零,相反,你的條件是關於NAS做爲零會搞亂排序。

+0

謝謝你的詳細回覆。實際上我想將NA列與非NA列一樣排序,我在上面說NA列放在非NA列後面,但這不是我想要的!我相信只要將參數「na.rm = T」放在colSums函數中就是我一直在尋找的東西! –

+0

對不起,我剛剛意識到NAs爲零不會影響我的排序結果,畢竟=)乾杯! –

+0

乾杯:)''''''' – bgoldst

0

要允許NA列與非NA列同等排序,請在「colSums」函數中使用「na.rm = TRUE」參數。這將覆蓋col列的原始排序,其中NA列在排序列後面未排序。最終的代碼是:

DF<-DF[, order(colSums(-DF, na.rm=T))]