此代码从数据框中的两个不同列生成一个句子
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 = ", ")
在独立线路上运行,我怎样才能让它在管道末端运行,如下所示(这会引发书面错误):
mtcars %>%
rownames_to_column(var = "car") %>%
sample_n(5) %>%
paste0(df$car, " (", df$mpg, ")", collapse = ", ")
with()
适用于此:
mtcars %>%
rownames_to_column(var = "car") %>%
sample_n(5) %>%
with(paste0(car, " (", mpg, ")", collapse = ","))
另一种可能性是用以下方式结束管道:
... %>%
mutate(word = glue("{car} ({mpg})")) %>%
pull(word) %>%
paste0(collapse =", ")
这里是基本 R 方法。
> set.seed(42)
> Map(\(x, y) sprintf('%s (%s)', x, y), rownames(mtcars), mtcars$mpg) |>
+ sample(5) |> toString()
[1] "Chrysler Imperial (14.7), Hornet Sportabout (18.7), Mazda RX4 (21), Pontiac Firebird (19.2), Merc 280 (19.2)"
或
> set.seed(42)
> transform(mtcars, car=rownames(mtcars)) |>
+ subset(car %in% sample(car, 5)) |>
+ with(Map(\(x, y) sprintf('%s (%s)', x, y), car, mpg)) |>
+ toString()
[1] "Mazda RX4 (21), Hornet Sportabout (18.7), Merc 280 (19.2), Chrysler Imperial (14.7), Pontiac Firebird (19.2)"
另外两个类似于
with()
的解决方案:
library(dplyr)
library(tibble)
set.seed(42)
mtcars %>%
rownames_to_column(var = "car") %>%
sample_n(5) %>%
{ paste0(.$car, " (", .$mpg, ")", collapse = ", ") }
#> [1] "Chrysler Imperial (14.7), Hornet Sportabout (18.7), Mazda RX4 (21), Pontiac Firebird (19.2), Merc 280 (19.2)"
创建于 2024-04-17,使用 reprex v2.1.0
library(dplyr)
library(tibble)
set.seed(42)
mtcars %>%
rownames_to_column(var = "car") %>%
sample_n(5) %>%
{\(x) paste0(x$car, " (", x$mpg, ")", collapse = ", ")}()
#> [1] "Chrysler Imperial (14.7), Hornet Sportabout (18.7), Mazda RX4 (21), Pontiac Firebird (19.2), Merc 280 (19.2)"
创建于 2024-04-17,使用 reprex v2.1.0
使用
magrittr
展览管 %$%
和 stringr::str_glue
的替代方案:
mtcars %>%
head() %>%
rownames_to_column(var = "car") %$%
str_glue("{car} ({mpg})") %>%
str_flatten_comma()
输出:
[1] "Mazda RX4 (21), Mazda RX4 Wag (21), Datsun 710 (22.8), Hornet 4 Drive (21.4), Hornet Sportabout (18.7), Valiant (18.1)"