在 R 中使用顺序(colSums())

Using order(colSums()) in R

我在 R 中有一个数据框矩阵,我希望按列的总和降序排列。我的数据从 +1 到 -1 不等。我有这段代码可以完美地做到这一点:

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

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

有没有一种方法可以像上面那样按列的总和对数据进行排序,同时也允许使用 NA 对列进行排序?

如果我理解正确,你想在 "non-NA columns" 后面排序 "NA columns",但是你也想根据应用 colSums() 的结果对 NA 列进行排序到 NA 列中的非 NA 单元格。您可以使用 order() 的附加参数来执行此操作,以打破您使用附加参数 na.rm=TRUE 调用 colSums() 的平局。这是一个总共有 4 列的演示,2 列有 NA,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 等同于将 NA 视为零,这与您将 NA 视为零会弄乱排序的附带条件相反。

要允许 NA 列与非 NA 列同等排序,请在 "colSums" 函数中使用 "na.rm=TRUE" 参数。这将覆盖 colSums 的原始排序,其中 NA 列在已排序的列后面未排序。最终代码为:

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