【问题标题】:Order rows in data frame数据框中的订单行
【发布时间】:2023-03-07 13:48:04
【问题描述】:

我知道这可能是一个奇怪的问题,但是:

我有一个或多或少看起来像这样的数据框:

    t1 t2 t3 t4
o1  NA  1  1  1
o2  1  NA NA NA
o3  NA NA 1  1
o4  1  1  NA NA
o5  1  1  1  1

我想重新排序,使它看起来像这样:

    t1 t2 t3 t4
o3  NA NA 1  1
o1  NA  1  1  1
o5  1  1  1  1
o4  1  1  NA NA
o2  1  NA NA NA

所以你可以看到,如果我们从左下角到右上角,就会有这个“隧道”(路径,随便什么)。底行包含从右侧算起最多的 NA,中间行没有,顶行是左侧的 NA(最上面的 NA)。

有没有简单(或至少不太难)的方法来做到这一点?数据框也比较大(400x3300)。必须保留列名和行名。然后我想获取这个数据框并制作热图。

【问题讨论】:

  • 您的非 NA 值是否不同?当您说要保留行名时,您的示例是如何做到的?
  • 是的,nonNA 值可能会有所不同。我的意思是我希望得到的 data.frame/matrix/whatever 能够正确标记每一行。正如您在示例中看到的,行顺序发生了变化,但每一行仍然使用它的原始标签 - 所以基本上标签随着行移动。

标签: r dataframe


【解决方案1】:

假设中间没有NAs 的行:

DF <- read.table(text="    t1 t2 t3 t4
o1  NA  1  1  1
o2  1  NA NA NA
o3  NA NA 1  1
o4  1  1  NA NA
o5  1  1  1  1", header=TRUE)

DF1 <- DF[is.na(DF$t1),]
DF2 <- DF[rowSums(is.na(DF))==0,]
DF3 <- DF[is.na(DF$t4),]

DF1 <- DF1[order(-rowSums(is.na(DF1))),]
DF3 <- DF3[order(rowSums(is.na(DF3))),]

DF <- rbind(DF1,DF2,DF3)

#    t1 t2 t3 t4
# o3 NA NA  1  1
# o1 NA  1  1  1
# o5  1  1  1  1
# o4  1  1 NA NA
# o2  1 NA NA NA

【讨论】:

  • 太棒了,我正在考虑做类似这样的事情,但我缺乏一些细节(选择带有 NA 的行并按 rowSums 排序),谢谢! :-)
【解决方案2】:
d <- data.frame(t1=c(NA, 1, NA, 1, 1),
                t2=c(1, NA, NA, 1, 1),
                t3=c(1, NA,  1, NA,1),
                t4=c(1, NA,  1, NA,1))
row.names(d) <- c("o1", "o2", "o3", "o4", "o5")
d
   t1 t2 t3 t4
o1 NA  1  1  1
o2  1 NA NA NA
o3 NA NA  1  1
o4  1  1 NA NA
o5  1  1  1  1


first1 <- apply(d, 1, function(x) {which(x == 1)[1] })
last1  <- apply(d, 1, function(x) {rev(which(x == 1))[1] })

d[order(first1, last1, decreasing=TRUE),]

   t1 t2 t3 t4
o3 NA NA  1  1
o1 NA  1  1  1
o5  1  1  1  1
o4  1  1 NA NA
o2  1 NA NA NA

【讨论】:

    猜你喜欢
    • 2022-09-29
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 2019-02-10
    • 2017-09-11
    • 1970-01-01
    相关资源
    最近更新 更多