在R中排列数据帧

时间:2016-01-25 16:30:44

标签: r

我有不同基因的基因突变基因座数据框。我想重新排列数据帧,以便每行只有一个值,并且该值从整个数据帧的最低到最高排列。我在下面有一个简短的例子。

以下是目前的情况:

a=c('1', '2', '5')
b=c('1', '2', '7')
c=c('5', '6', NA)
df=data.frame(a,b,c)

   A  B  C 
1  1  1  5
2  2  2  6
3  5  7  NA

以下是我希望看到的内容:

   A  B  C  
1  1  1  NA
2  2  2  NA
3  5  NA 5
4  NA NA 6
5  NA 7  NA

非常感谢任何帮助。谢谢。

2 个答案:

答案 0 :(得分:3)

这是一个可能的解决方案

v1 <- sort(unlist(lapply(df, function(x) 
            unique(x[!is.na(x)])), use.names=FALSE))
l1 <- length(unique(v1))
m1 <- matrix(, ncol=ncol(df), nrow=l1)
lst <- split(v1, v1)
i1 <- rep(seq_along(lst), lengths(lst))
j1 <- unlist(lapply(lst, function(x) which(df==unique(x),
             arr.ind=TRUE)[,2]), use.names=FALSE)
m1[cbind(i1,j1)] <- v1
m1
#      [,1] [,2] [,3]
# [1,]    1    1   NA
# [2,]    2    2   NA
# [3,]    5   NA    5
# [4,]   NA   NA    6
# [5,]   NA    7   NA

数据

df <- structure(list(A = c(1L, 2L, 5L), B = c(1L, 2L, 
 7L), C = c(5L, 
6L, NA)), .Names = c("A", "B", "C"), class = "data.frame", 
 row.names = c("1", "2", "3"))

答案 1 :(得分:2)

尝试使用recast融合并投射数据框。我们可以使用!is.na(value)NA值作为唯一行删除:

library(reshape2)
recast(df, value[!is.na(value)]~variable[!is.na(value)])[-1]
#    A  B  C
# 1  1  1 NA
# 2  2  2 NA
# 3  5 NA  5
# 4 NA NA  6
# 5 NA  7 NA