r - 如何使用 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")
}
解决方案
使用tidyverse
,我们可以按 'study_question 分组拆分,循环使用list
with并使用fromiwalk
写入 'csv'write_csv
readr
library(dplyr)
library(purrr)
library(readr)
library(stringr)
df %>%
group_split(study_question) %>%
iwalk(~ write_csv(.x, str_c('data/sq', .y, '_papers.csv'))
推荐阅读
- python - 如何在 Keras 中正确连接 Dense 层和 Lambda 层?
- css - 2个宽度和超过三分之一宽度的媒体查询
- cocoa - NSNumberFormatter 通过 StoryBoard - Xcode 9
- java - 加速声纳扫描
- python - 更改 PySpark 中日期时间戳的显示格式
- docker - Raspbian - 存储静态内容的最佳 docker 镜像
- spring-integration-dsl - Spring Cloud Contract - 使用 AmqpInboundChannelAdapterSpec 进行消息传递的 Stub Runner
- symfony - Symfony4 / Doctrine,如何选择“不同”的对象?getResult() 返回字符串数组,而不是对象数组
- php - 升级php7.0到php7.2
- java - 在 Spring Boot 中出现异常