在数据框中排序行

时间:2013-06-04 06:11:42

标签: r dataframe

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

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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