整齐的R方式,使用列中的信息导入CSV

问题描述

我有一个数据框,其中包含来自各种计算的行。每行都有一个目录和一个标签。我想从每一行的目录中读取一个文件并分配标签。例如

dfs <- tribble(~dir,~label,"d123","dogs","c123","cats","b123","birds")

foodcsv <- "food.csv"
drinkcsv <- "drink.csv"

animalfoods <- mutate(dfs,fname=paste0(dir,"/csv_out/",foodcsv) %>%
  ????? rowwise/map/lapply/something(read_csv(fname) %>% mutate(label=label)) ???? %>%
  bind_rows

所以???中的部分是我不知道的。基础文件都具有相同的列标题。 最终我想要类似的东西

id     consumed label
dog1   chow1    dog   #from d123/csv_out/food.csv
dog2   chow2    dog
cat1   chow3    cat   #from c123/csv_out/food.csv
...

在这种情况下,我们将使用例如d123 / csv_out / food.csv:

id,consumed
dog1,chow1
dog2,chow2

解决方法

尝试这种purrr方法:

library(purrr)
library(dplyr)

result <- map_df(c(foodcsv,drinkcsv),function(x) {
              all_files <- paste0(dfs$dir,"/csv_out/",x)
              map2_df(all_files,dfs$label,~read.csv(.x) %>% mutate(label = .y))
           })

如果我已正确理解您的意见,foodcsvdrinkcsv出现在dfs$dir中的所有目录中。因此,对于此示例,您将总共获得6个文件。您可以使用map来读取foodcsvdrinkcsv的所有文件,向其中添加相应的labels并将所有数据帧绑定在一起。