如何将DataFrame列直接通过管道传入函数,整合到管道链末尾?
问题:将文本拼接整合到dplyr管道中
现有代码可以从DataFrame的两列生成拼接后的语句:
library(dplyr); library(tibble); library(magrittr) mtcars %>% rownames_to_column(var = "car") %>% sample_n(5) -> df paste0(df$car, " (", df$mpg, ")", collapse = ", ") # 输出示例:"Mazda RX4 Wag (21), Hornet Sportabout (18.7), Merc 280 (19.2), Dodge Challenger (15.5), Merc 450SLC (15.2)"
但想把拼接语句paste0(df$car, " (", df$mpg, ")", collapse = ", ")直接放到管道末尾,直接运行下面的代码会报错,调整方法如下:
方案1:逐行拼接后合并
先给每行生成拼接好的文本,再提取所有行的结果合并成字符串:
mtcars %>% rownames_to_column(var = "car") %>% sample_n(5) %>% mutate(text = paste0(car, " (", mpg, ")")) %>% pull(text) %>% paste(collapse = ", ")
方案2:用magrittr的%$%管道
%$%是magrittr提供的特殊管道,会把前一步数据框的列名直接暴露出来,不用再用$引用:
mtcars %>% rownames_to_column(var = "car") %>% sample_n(5) %$% paste0(car, " (", mpg, ")", collapse = ", ")
方案3:用with()包裹拼接逻辑
在管道里用with()直接引用数据框的列:
mtcars %>% rownames_to_column(var = "car") %>% sample_n(5) %>% with(paste0(car, " (", mpg, ")", collapse = ", "))
方案4:用glue包简化写法(更易读)
如果安装了glue包,用glue_data()可以更直观地拼接文本:
library(glue) mtcars %>% rownames_to_column(var = "car") %>% sample_n(5) %>% glue_data("{car} ({mpg})") %>% paste(collapse = ", ")
内容的提问来源于stack exchange,提问作者luciano
相关产品推荐
相关产品推荐

