【问题标题】:tidy R way to import csv's using information from column使用列中的信息导入 csv 的整洁 R 方式
【发布时间】:2020-12-29 12:57:54
【问题描述】:

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

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

【问题讨论】:

  • 提供food.csv和drink.csv的样本
  • '''d123/csv_out/food.csv: id,consumed dog1,chow1 dog2,chow2

标签: r dplyr functional-programming tidy


【解决方案1】:

试试这个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 并将所有数据帧绑定在一起。

【讨论】:

    猜你喜欢
    • 2014-12-03
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多