我在R中有一個數據幀矩陣,我希望按列的順序降序排列。我的數據從+1到-1的值不等。我有這樣的代碼,這是否很完美:在R中使用order(colSums())
DF<-DF[, order(colSums(-DF))]
不過,我確實有一些NA值攤開數據之間(沒有單一的列或行是所有NA,所以我不能簡單地刪除整列或行) 。我相信數據沒有被正確排序,因爲包含NAs的列沒有排序,只是放置在排序列後面。
有沒有一種方法來按上述順序排列數據,還允許使用NAs對列進行排序?
我在R中有一個數據幀矩陣,我希望按列的順序降序排列。我的數據從+1到-1的值不等。我有這樣的代碼,這是否很完美:在R中使用order(colSums())
DF<-DF[, order(colSums(-DF))]
不過,我確實有一些NA值攤開數據之間(沒有單一的列或行是所有NA,所以我不能簡單地刪除整列或行) 。我相信數據沒有被正確排序,因爲包含NAs的列沒有排序,只是放置在排序列後面。
有沒有一種方法來按上述順序排列數據,還允許使用NAs對列進行排序?
如果我的理解正確,您想在「非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做爲零會搞亂排序。
謝謝你的詳細回覆。實際上我想將NA列與非NA列一樣排序,我在上面說NA列放在非NA列後面,但這不是我想要的!我相信只要將參數「na.rm = T」放在colSums函數中就是我一直在尋找的東西! –
對不起,我剛剛意識到NAs爲零不會影響我的排序結果,畢竟=)乾杯! –
乾杯:)''''''' – bgoldst
要允許NA列與非NA列同等排序,請在「colSums」函數中使用「na.rm = TRUE」參數。這將覆蓋col列的原始排序,其中NA列在排序列後面未排序。最終的代碼是:
DF<-DF[, order(colSums(-DF, na.rm=T))]
是的,你可以看看'order(c(1,NA,3,NA))'並且看到NAs確實分配了最後的命令。要修改它,可以使用'?order'中提到的'na.last'選項。 '?colSums'表明它有一個你可能想要的'na.rm'選項。順便說一下,[dataframes]是R.的錯誤標籤。 – Frank