将 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)
我有 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)