我有两个相同大小的数据集[132,450000]。一个具有值,另一个具有与这些值对应的p值。现在我想组合这两个数据集,以便我有一个大的数据帧[264,450000],其中列的值后跟具有相应p值的列。 rownames完全相同,列名称如下:df1中的sample1和df2中的sample1_pval
例如,我有两个像这样的数据框
> df1
x y
cg1 1 a
cg2 2 b
cg3 3 c
cg4 4 d
cg5 5 e
> df2
x_pval y_pval
cg1 6 f
cg2 7 g
cg3 8 h
cg4 9 i
cg5 10 j
我想将它们与这个顺序合并:df1的第一列,然后是df2的第一列,接着是df1的第二列,接着是第二列df2等等......
那么它会是这样的:
> df
x x_pval y y_pval
cg1 1 6 a f
cg2 2 7 b g
cg3 3 8 c h
cg4 4 9 d i
cg5 5 10 e j
我想保留列名,但我之后可以添加的rownames,因为它们在两个数据帧中都是相同的。由于我正在使用大型数据集,因此我不想输入所有列并使用" cbind"。我无法找到" merge"的代码。每次从每个数据集中执行一列......
是否有配方或包装可以做到这一点?
任何可以帮助我的人?
答案 0 :(得分:2)
另一种选择是连接两个数据集的列序列,order
然后cbind
cbind(df1, df2)[order(c(seq_along(df1), seq_along(df2)))]
# x x_pval y y_pval
#cg1 1 6 a f
#cg2 2 7 b g
#cg3 3 8 c h
#cg4 4 9 d i
#cg5 5 10 e j
答案 1 :(得分:1)
一个想法是cbind
数据框和order
列名前缀,即
dd <- cbind(df1, df2)
dd[order(sub('_.*', '', names(dd)))]
给出,
x x_pval y y_pval cg1 1 6 a f cg2 2 7 b g cg3 3 8 c h cg4 4 9 d i cg5 5 10 e j
如果您的列始终是结构化的示例,那么这也可以,
data.frame(dd[c(TRUE, FALSE)], dd[c(FALSE, TRUE)]) #dd taken from above
答案 2 :(得分:1)
您可以使用%%
对列进行重新排序,以便为您提供奇数/偶数列号。
修改强>
这个想法结果很糟糕,原始代码是无法修复的。 在之后我看到@Sotos使用order
的解决方案和他对c(TRUE, FALSE)
的使用的评论我决定发布一个有效但不等于那个的解决方案。在这里。
altern <- function(m, n){
order(c(which(rep(c(TRUE, FALSE), m)), which(rep(c(FALSE, TRUE), n))))
}
df3 <- cbind(df1, df2)
n <- seq_along(names(df3))
df3 <- df3[, n[altern(ncol(df1), ncol(df2))]]
df3
如您所见,此解决方案是最复杂的。
答案 3 :(得分:1)
或者如果你想避免排序:
cbind(df1, df2)[rep(seq_along(df1),each=2)+rep(c(0,ncol(df1)),ncol(df1))]