将两个相同大小的数据框合并为一列

Combine two data frames of the same size one column after each other

我有两个大小相同的数据集 [132,450000]。一个具有值,另一个具有与这些值对应的 p 值。现在我想合并这两个数据集,以便我有 1 个大数据框 [264,450000],其中包含值的列,后跟包含相应 p 值的列。行名完全相同,列名如下: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

我想保留列名,但我可以稍后添加行名,因为它们在两个数据框中是相同的。由于我正在处理大型数据集,因此我不想输入所有列并使用 "cbind"。而且我找不到 "merge" 的代码一次从每个数据集中做一列......

是否有可以做到这一点的公式或软件包?

谁能帮帮我?

一个想法是 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

您可以使用 %% 对列重新排序,以获得 odd/even 列编号。

编辑。
这个想法被证明是不好的,原来的代码是 bug 无法修复。 之后,我看到了@Sotos 使用 order 的解决方案以及他对 c(TRUE, FALSE) 使用的评论,我决定 post 一个可行的解决方案,受到启发但不等于那个。在这里。

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

如您所见,此解决方案是所有解决方案中最复杂的。

另一种选择是连接两个数据集的列序列,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

或者如果你想避免排序:

cbind(df1, df2)[rep(seq_along(df1),each=2)+rep(c(0,ncol(df1)),ncol(df1))]