将数据帧与一些常见列合并,并使用NA填充其他列

时间:2017-05-27 14:53:10

标签: r merge dplyr

我有大约50多个csv文件,它们按此顺序共享相同的4列:

REG_ID  region  age age_num

然后从1990年到2016年以这种格式的年份:

REG_ID  region  age age_num y_1992 y_1993 y_1994 y_2014.15

我想知道合并它们的最佳方法是什么。通过每个添加缺少的年份列将是耗时的并且可能导致错误。 结束格式是这样的:

REG_ID       region        reg_num   age   age_num  y_1991 y_1992 y_1993
BFM2         Boucle        1       c_0_4    0       770    NA     120
BFM2         Boucle        1       c_5_9    5       810    NA     11 
BFM2         Boucle        1     c_10_14   10       704    NA     130
BFM2         Boucle        1     c_15_19   15       71     NA     512
BFM2         Boucle        1     c_20_24   20       181    NA     712

2 个答案:

答案 0 :(得分:2)

这是一种使用tidyverse工具可以实现的方法。首先使用dir获取csv路径的向量,然后使用purrr:map将其全部读取,返回数据框列表,然后使用purrr::reduce进行合并使用dplyr::left_join的所有数据框。


library(readr)
library(purrr)
library(dplyr)

创建数据集

read_csv(
"REG_ID,region,reg_num,age,age_num,y_1991
BFM2,Boucle,1,c_0_4,0,770
BFM2,Boucle,1,c_5_9,5,810
BFM2,Boucle,1,c_10_14,10,704
BFM2,Boucle,1,c_15_19,15,71
BFM2,Boucle,1,c_20_24,20,181") %>% 
  write_csv("df_91.csv")

read_csv(
"REG_ID,region,reg_num,age,age_num,y_1992
BFM2,Boucle,1,c_0_4,0,NA
BFM2,Boucle,1,c_5_9,5,NA
BFM2,Boucle,1,c_10_14,10,NA
BFM2,Boucle,1,c_15_19,15,NA
BFM2,Boucle,1,c_20_24,20,NA") %>% 
  write_csv("df_92.csv")

read_csv(
"REG_ID,region,reg_num,age,age_num,y_1993
BFM2,Boucle,1,c_0_4,0,120
BFM2,Boucle,1,c_5_9,5,11 
BFM2,Boucle,1,c_10_14,10,130
BFM2,Boucle,1,c_15_19,15,512
BFM2,Boucle,1,c_20_24,20,712") %>% 
  write_csv("df_93.csv")

创建最终合并数据集

dir(".", "\\.csv", full.names = TRUE) %>% 
  map(read_csv) %>% 
  reduce(left_join, by = c("REG_ID", "region", "reg_num", "age", "age_num"))

#> # A tibble: 5 x 8
#>   REG_ID region reg_num     age age_num y_1991 y_1992 y_1993
#>    <chr>  <chr>   <int>   <chr>   <int>  <int>  <chr>  <int>
#> 1   BFM2 Boucle       1   c_0_4       0    770   <NA>    120
#> 2   BFM2 Boucle       1   c_5_9       5    810   <NA>     11
#> 3   BFM2 Boucle       1 c_10_14      10    704   <NA>    130
#> 4   BFM2 Boucle       1 c_15_19      15     71   <NA>    512
#> 5   BFM2 Boucle       1 c_20_24      20    181   <NA>    712

答案 1 :(得分:0)

我认为最好的方法是:

library(data.table)
library(stringr)
data<-list("vector")
files_to_loop<-list.vector()[str_detect(list.vector(),".csv")]
for (i in 1:length(files_to_loop)){
  data[[i]]<-fread(files_to_loop[i])
}
data<-rbindlist(data,use.names=TRUE,fill=TRUE)