将 csv 文件合并为 1 个不同的列

Combine csv files into 1 with different columns

我有 3 个大型 csv 文件(OCA1 = 3649 个观察值,521 个变量,OCA2 = 3772 个观察值,2513 个变量,OCA3 = 878 个观察值,2513 个变量)。我想将它们组合成 R 中的 1 个 csv 文件。我唯一担心的是它们有不同的列,但是每个文件的前 10 列是相同的。这是一个例子:

OCA1:

OCA2:

如您所见,直到 "Format" 列名称都是相同的。我想要的是所需的输出如下所示:

#CHROM      POS    ID   REF  ALT  QUAL   FILTER   INFO  FORMAT  NA06984  NA006985  HG00096  HG00097
   11      891...  rs..  A   G    100      PASS    ..    GT       0|0    0|0
   11      891...  rs..  A   G    100      PASS    ..    GT                       0|0    0|0

OCA2 "Format" 之后的列被添加到 OCA1,OCA2 的行在最后一次 OCA1 观察 (3649) 之后被添加。

我最初尝试了 rbind,但由于列的原因,我很吃力。

bind_rows from dplyr 可以帮助绑定具有不同列数的数据集。这是一个例子:

library(dplyr)

OCA1 <- data_frame(
  x = 1:3
)

OCA2 <- data_frame(
  x = 1:5,
  y = letters[1:5]
)

OCA3 <- data_frame(
  x = 1:10,
  y = letters[1:10],
  z = LETTERS[1:10]
)

df <- bind_rows(
  OCA1,
  OCA2,
  OCA3
)

也许您可以为缺失的列创建 NA 列,然后执行 rbind

df_l = list(df1 = data.frame('A'=rep("f1",10),'B'=runif(10),'C'=seq(1:10)),
            df2 = data.frame('A'=rep("f2",20),'B'=runif(20),'D'=paste0("X",seq(1:20))),
            df3 = data.frame('A'=rep("f3",30),'C'=seq(1:30),'D'=paste0("Y",seq(1:30))))
all_names = unique(c(colnames(df_l[['df1']]),
                     colnames(df_l[['df2']]),
                     colnames(df_l[['df3']]))) 

for (i in names(df_l)) {
  abs_col = all_names[!all_names %in% names(df_l[[i]])]
  if(length(abs_col) > 0) df_l[[i]][,abs_col] <- NA
} ; rm(i)

do.call("rbind", df_l)