我有不同基因的基因突变基因座数据框。我想重新排列数据帧,以便每行只有一个值,并且该值从整个数据帧的最低到最高排列。我在下面有一个简短的例子。
以下是目前的情况:
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
非常感谢任何帮助。谢谢。
答案 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