将两个相同大小的数据框合并为一列
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))]
我有两个大小相同的数据集 [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))]