将CSV文件合并为一个以变量名作为观察值的

时间:2019-07-16 17:45:30

标签: r csv

我正在尝试合并多个CSV数据集,并且每个数据集的变量名都没有观察值。我想创建一个新的组合CSV文件,其中CSV文件的名称为变量名,而上一个文件的变量名列表为观察值。

每个数据集的列名可能会有些重叠,但是许多变量是不同的。我想保留每个数据集中的所有变量。

目前,我只知道如何编写代码来合并文件,并将变量名连续列为单独的列。

这是我用来合并文件的代码:

library(dplyr)
library(readr)
newFile <- list.files(full.names = TRUE) %>%
  lapply(read_csv) %>%
  bind_rows

This is one example of what the current CSV files look like

This is what I would like the dataset to look like once I combine them

1 个答案:

答案 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

根据您的示例数据和预期输出,我认为mapunnest函数在这里仍然可以使用。如果您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>