我正在尝试合并多个CSV数据集,并且每个数据集的变量名都没有观察值。我想创建一个新的组合CSV文件,其中CSV文件的名称为变量名,而上一个文件的变量名列表为观察值。
每个数据集的列名可能会有些重叠,但是许多变量是不同的。我想保留每个数据集中的所有变量。
目前,我只知道如何编写代码来合并文件,并将变量名连续列为单独的列。
这是我用来合并文件的代码:
library(dplyr)
library(readr)
newFile <- list.files(full.names = TRUE) %>%
lapply(read_csv) %>%
bind_rows
答案 0 :(得分:1)
您可以尝试使用map()
和unnest()
来执行此操作。这将创建一个单独的数据帧,其中合并了从CSV文件读取的所有数据。它将使用文件名创建一个附加的分组变量。假设所有文件的列名都相同。
# list files
d <- list.files(full.names = F)
# for each file, read in, expand rows (unnest)
# read all cols in as character
# and add label from filename
dd <- data.frame(filename=d) %>%
mutate(cont=map(filename, ~read_csv(file.path('',.), # !!! specify your file path here !!!
col_types = cols(.default = "c")))) %>%
unnest()
UPDATE
根据您的示例数据和预期输出,我认为map
和unnest
函数在这里仍然可以使用。如果您gather
合并了数据,则可以filter
找出每个CSV文件中的变量。它虽然不漂亮,但可能符合您的目的。
# create toy CSV files in wd
df1 <- data.frame(matrix(runif(100),10)) # 10 vars named X1 to X10
df2 <- data.frame(matrix(runif(120),12)) # as above but more obs
df3 <- data.frame(matrix(runif(120),8)) # 15 vars named X1 to X15
df4 <- data.frame(matrix(runif(100),10)) # 10 vars names a to j
names(df4) <- letters[1:10]
write_csv(df4,'df4.csv')
d <- list.files(pattern='\\.csv',full.names = T)
dd <- data.frame(filename=d) %>%
mutate(cont=map(filename,~read_csv(file.path('.',.),
col_types = cols(.default = "c")))) %>%
unnest() %>%
gather(k,v,-filename) %>% filter(!is.na(v)) %>%
distinct(filename,k)
dd %>% reshape2::dcast(k~filename)
k ./df1.csv ./df2.csv ./df3.csv ./df4.csv
1 a <NA> <NA> <NA> a
2 b <NA> <NA> <NA> b
3 c <NA> <NA> <NA> c
4 d <NA> <NA> <NA> d
5 e <NA> <NA> <NA> e
6 f <NA> <NA> <NA> f
7 g <NA> <NA> <NA> g
8 h <NA> <NA> <NA> h
9 i <NA> <NA> <NA> i
10 j <NA> <NA> <NA> j
11 X1 X1 X1 X1 <NA>
12 X10 X10 X10 X10 <NA>
13 X11 <NA> <NA> X11 <NA>
14 X12 <NA> <NA> X12 <NA>
15 X13 <NA> <NA> X13 <NA>
16 X14 <NA> <NA> X14 <NA>
17 X15 <NA> <NA> X15 <NA>
18 X2 X2 X2 X2 <NA>
19 X3 X3 X3 X3 <NA>
20 X4 X4 X4 X4 <NA>
21 X5 X5 X5 X5 <NA>
22 X6 X6 X6 X6 <NA>
23 X7 X7 X7 X7 <NA>
24 X8 X8 X8 X8 <NA>
25 X9 X9 X9 X9 <NA>