1

我知道这可能是一个特殊的问题,但是:

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

    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)。必须保留列名和行名。然后我想获取这个数据框并制作热图。

4

2 回答 2

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
于 2013-06-04T07:21:14.107 回答
2

假设没有NA只在中间有 s 的行:

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
于 2013-06-04T07:02:42.300 回答