在dplyr链中使用write.csv()

17

我以前遇到过这个问题,但只是在链条之外编写了导出函数。是否有办法在 dplyr 链中包含一个 write.csv 语句呢?

library(dplyr)

data_set %>%
filter(Date == Sys.Date() - 1 | Date == Sys.Date()) %>%
write.csv('data_set_twodays.csv', row.names = F) %>%
filter(Date = Sys.Date()) %>%
write.csv('data_set_today.csv', row.names = F)
NULL

1
我假设该链接收每个“链接”的返回值并将其传递给下一个。由于write.csv没有返回值,所以这可能行不通。您可以包装write.csv并确保返回数据...然后也许... - Justin
请看一下我的答案。我相信它对于有同样需求的其他人更有用。 - kmace
2个回答

26

在0.2版本中,这对我似乎起作用了:

mtcars %>% filter(cyl == 4) %>% write.csv(.,file = "~/Desktop/piping.csv")

5
哇,这个dplyr东西看起来真的像是一门新语言……就像是Unix管道遇到Lisp之类的东西。 - Stephen Henderson
3
由于数据是传递给write.csv()函数的第一个参数,因此您不需要使用点号.或显式指定参数名称file - hadley
4
有没有办法让这段代码与 group_by 一起使用呢?比如: df %>% group_by(SomeGroup) %>% write.csv(paste0(SomeGroup, ".csv")) - eenblam
1
不是 dplyr 的答案,但我在发布后想起了 split 存在。假设您不需要结果中的 SomeGroup 列:dl = split(df, df$SomeGroup); for (somegroup in dl) {write.csv(select(somegroup, -Somegroup), paste0(first(somegroup$Somegroup), ".csv")) - eenblam
请参考 https://dev59.com/UlgR5IYBdhLWcg3whdjv#41233405,使用 group_by 后跟 do 函数调用来导出数据框。 - Samir
答案无法在管道中间工作,这正是OP所要求的。请参考@kmace的答案,它可以在管道中间工作。 - Evgenii

11
T管是您要寻找的东西: %T>% 将运行函数,但将输入作为输出传递。
library(dplyr)
library(magrittr)

data_set %>%
filter(Date == Sys.Date() - 1 | Date == Sys.Date()) %T>%
write.csv('data_set_twodays.csv', row.names = F) %>%
filter(Date = Sys.Date()) %T>%
write.csv('data_set_today.csv', row.names = F) 

人们通常使用它来绘制中间结果,而不会破坏他们的管道!

来自文档:

rnorm(200) %>%
matrix(ncol = 2) %T>%
plot %>% # plot usually does not return anything. 
colSums

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接