我在R中有一个数据框矩阵,我希望按降序排列列。我的数据从+1到-1的值不等。我有这个代码完美地完成了这个:
DF<-DF[, order(colSums(-DF))]
但是,我确实在数据中分布了一些NA值(没有单个列或行都是NA,所以我不能简单地删除整个列或行)。我认为数据没有正确排序,因为包含NA的列没有排序,只是放在排序列的后面。
有没有办法按照上面的列总和对数据进行排序,还允许使用NA对列进行排序?
答案 0 :(得分:5)
如果我理解正确,您希望对“非NA列”后面的“NA列”进行排序,但是您还希望根据应用于{NA} colSums()
的结果对NA列进行排序。 NA列中的非NA细胞。您可以使用order()
的附加参数执行此操作,以打破使用附加参数colSums()
调用na.rm=TRUE
的关联。这是一个总共有4列的演示,2个有NAs,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视为零,与您的条件相反,将NAs视为零会使排序陷入混乱。
答案 1 :(得分:0)
要允许NA列与非NA列平分,请在“colSums”函数中使用“na.rm = TRUE”参数。这将覆盖colSums的原始排序,其中NA列在排序列后面未排序。最终的代码是:
DF<-DF[, order(colSums(-DF, na.rm=T))]