将两个相同大小的数据帧一个接一个地组合在一起

时间:2017-09-12 09:41:12

标签: r dataframe cbind

我有两个相同大小的数据集[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"的代码。每次从每个数据集中执行一列......

是否有配方或包装可以做到这一点?

任何可以帮助我的人?​​

4 个答案:

答案 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))]