首页 > 解决方案 > 如何使用 tidyverse map 在 R 中迭代过滤和写入 csv

问题描述

我有一个充满研究元数据的数据框,有两个关键列:引文信息和我的问题,它们与:

library(tidyverse)

citation <- c(letters) 
study_question <- rep(1:3, len = length(citation))

df <- as.data.frame(cbind(citation, study_question))

#so that df looks like: 

citation study_question
 [1,] "a"      "1"           
 [2,] "b"      "2"           
 [3,] "c"      "3"           
 [4,] "d"      "1"           
 [5,] "e"      "2"           
 [6,] "f"      "3"           
 [7,] "g"      "1"           
 [8,] "h"      "2"           
 [9,] "i"      "3"           
[10,] "j"      "1"           
[11,] "k"      "2"           
[12,] "l"      "3"           
[13,] "m"      "1"           
[14,] "n"      "2"           
[15,] "o"      "3"           
[16,] "p"      "1"           
[17,] "q"      "2"           
[18,] "r"      "3"           
[19,] "s"      "1"           
[20,] "t"      "2"           
[21,] "u"      "3"           
[22,] "v"      "1"           
[23,] "w"      "2"           
[24,] "x"      "3"           
[25,] "y"      "1"           
[26,] "z"      "2"           
> 

我想做的是使用迭代函数来过滤学习问题= 1,以获得:

> df %>% filter(study_question == 1)
  citation study_question
1        a              1
2        d              1
3        g              1
4        j              1
5        m              1
6        p              1
7        s              1
8        v              1
9        y              1

然后将该引用列表写入名为“sq1_papers.csv”的 csv,然后对研究问题 = 2 执行相同操作,输出为“sq2_papers.csv”,然后对问题 3 执行相同操作。

我已经用 for 循环尝试过这个,但它没有工作,并且更愿意用 map 函数尝试它,我过去已经开始工作了。这是我尝试过的代码:

for(i in study_question) {
  file <- df  %>% 
    filter(study_question == study_question[[i]]) 
  write_csv(file, "data/sq[i]_papers.csv")
}

标签: rcsviteration

解决方案


使用tidyverse,我们可以按 'study_question 分组拆分,循环使用listwith并使用fromiwalk写入 'csv'write_csvreadr

library(dplyr)
library(purrr)
library(readr)
library(stringr)
df %>%
      group_split(study_question) %>%
      iwalk(~ write_csv(.x, str_c('data/sq', .y, '_papers.csv'))

推荐阅读