如何在R中根据条件合并多个csv文件中的选定数据?

b09cbbtk  于 2023-05-26  发布在  其他
关注(0)|答案(1)|浏览(109)
    • 在R中使用循环条件合并数据的问题**

我有一个48134个独特观察结果的主要数据集,共有35个变量(2015 - 2020年的手术人群)。一个是LopNr,它是唯一的病例标识符,另外两个是OPERATION_START(POSIXct % d %B %Y:%H:%M:%S)和YearOfSurgery(character),它们都包括患者接受手术的年份。
我现在想包括其他的社会经济数据,我已经存储为六个单独的csv文件,每个包含年份一个。我想根据每个病例接受手术的年份添加SES数据。例如,如果在2015年进行手术,则从2015 csv文件中提取数据。我还希望我添加的变量被视为一个变量,即使var1可以根据手术年份从六个csv文件中的任何一个中提取。
我正在使用tidyverse,我尝试的最后一个循环如下所示(Raks_SummaInk是我想要提取的变量之一):

#TEST OF LOOP 230523 08:24

years <- c(2015, 2016, 2017, 2018, 2019, 2020)

HIP2_SPOR_SES <- HIP2_SPOR  # Create a new dataset to store the merged data (basically a copy of HIP2_SPOR)

for (year in years) {
  csv_file <- paste0("MC_Lev_LISA_", year, ".csv")
  
  socioeco_data <- read_csv(csv_file) %>%
    select(Lopnr, Raks_SummaInk)
  
  merged_data <- HIP2_SPOR_SES %>%
    filter(YearOfSurgery == as.character(year)) %>%
    left_join(socioeco_data, by = c("LopNr" = "Lopnr")) %>%
    summarize(Raks_SummaInk = sum(Raks_SummaInk, na.rm = TRUE))
  
  HIP2_SPOR_SES <- merge(HIP2_SPOR_SES, merged_data, all = TRUE)  # Merge the new data with the existing dataset
  
}

这导致了一个新的数据集HIP2_SPOR_SES,其中包含45个变量,所有新的变量都名为Raks_SummaInk,但后缀不同,不幸的是只有NAs。

velaa5lx

velaa5lx1#

利用Map ping和Reduce ing的一种方法:

library(dplyr)
  • 创建示例手术。数据:
main_data <- data.frame(LopNr = paste0('ID_', 1:2),
                        OPERATION_START = as.Date(c('2015/04/08 10:00:00', '2016/02/16 11:00:00')),
                        YearOfSurgery = as.character(2015:2016)
                        )
# > main_data
  LopNr OPERATION_START YearOfSurgery
1  ID_1      2015-04-08          2015
2  ID_2      2016-02-16          2016
  • 设置路径到文件夹与社会经济文件:
data_dir <- 'csv_dir' ## (replace with path to your soceco csv folder)
  • 使用社会经济数据创建一些示例csv文件:
read.table(text = 'RaksSummaInk,Lopnr\n123,ID_1\n516,ID_2\n', sep = ',', header = TRUE) |>
  write.csv(file = 'csv_dir/MC_Lev_LISA_2015.csv') 
read.table(text = 'RaksSummaInk,Lopnr\n725,ID_1\n400,ID_2\n', sep = ',', header = TRUE) |>
  write.csv(file = 'csv_dir/MC_Lev_LISA_2016.csv')
  • 读入、行绑定和转换(重命名、使唯一)soceco文件:
soceco_data <- 
  c(2015, 2016) |>
  Map(f = \(yr) file.path(data_dir, sprintf('MC_Lev_LISA_%s.csv', yr)) |>
                read.csv() |>
                mutate(year = yr)
      ) |>
  Reduce(f = bind_rows) |>
  distinct(LopNr = Lopnr, ## match captialisation in main_data
           RaksSummaInk,
           YearOfSurgery = as.character(year))
> soceco_data
  RaksSummaInk LopNr YearOfSurgery
1          123  ID_1          2015
2          516  ID_2          2015
3          725  ID_1          2016
4          400  ID_2          2016
  • 将soceco数据连接到主数据:
main_data |>
  left_join(soceco_data, c('LopNr', 'YearOfSurgery'))
LopNr OPERATION_START YearOfSurgery RaksSummaInk
1  ID_1      2015-04-08          2015          123
2  ID_2      2016-02-16          2016          400

相关问题