我知道这可能是一个特殊的问题,但是:
我有一个看起来或多或少的数据框:
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)。必须保留列名和行名。然后我想采用这个数据框并制作热图。
答案 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