在R中使用order(colSums())

时间:2016-04-04 19:33:48

标签: r sorting na

我在R中有一个数据框矩阵,我希望按降序排列列。我的数据从+1到-1的值不等。我有这个代码完美地完成了这个:

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

但是,我确实在数据中分布了一些NA值(没有单个列或行都是NA,所以我不能简单地删除整个列或行)。我认为数据没有正确排序,因为包含NA的列没有排序,只是放在排序列的后面。

有没有办法按照上面的列总和对数据进行排序,还允许使用NA对列进行排序?

2 个答案:

答案 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))]