Этот код составляет предложение из двух разных столбцов во фрейме данных.
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.
sprintf('%s (%s)', 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)"
или
transform(mtcars, car=rownames(mtcars)) |>
subset(car %in% sample(car, 5)) |>
with(sprintf('%s (%s)', 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)"
Created on 2024-04-17 with 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)"
Created on 2024-04-17 with reprex v2.1.0
library(dplyr)
library(tibble)
set.seed(42)
my_fun <- function(x) paste0(x$car, " (", x$mpg, ")", collapse = ", ")
mtcars %>%
rownames_to_column(var = "car") %>%
sample_n(5) %>%
my_fun()
#> [1] "Chrysler Imperial (14.7), Hornet Sportabout (18.7), Mazda RX4 (21), Pontiac Firebird (19.2), Merc 280 (19.2)"
Created on 2024-04-17 with 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)"
glue::glue_data() — это краткое решение, созданное специально для этого варианта использования:
library(dplyr)
library(tibble)
library(glue)
library(stringr)
mtcars |>
rownames_to_column("car") |>
sample_n(5) |>
glue_data("{car} ({mpg})") |>
str_flatten_comma()
#> [1] "Merc 230 (22.8), Hornet 4 Drive (21.4), Merc 280 (19.2), Camaro Z28 (13.3), Lotus Europa (30.4)"
Created on 2024-04-17 with reprex v2.1.0
Я бы предложил такой вариант:
mtcars %>%
rownames_to_column(var = "car") %>%
sample_n(5) %>%
transmute(tmp = paste0(car, " (", mpg, ")")) %>%
pull %>%
paste0(collapse = ", ")
[1] "Fiat 128 (32.4), Merc 280C (17.8), Valiant (18.1), Lotus Europa (30.4), Cadillac Fleetwood (10.4)"
ПРИЛОЖЕНО
Если вам нужно сохранить df, как в вашем вопросе, вы можете использовать %T>% из пакета magrittr с помощью assign() вызова:
mtcars %>%
rownames_to_column(var = "car") %>%
sample_n(5) %T>%
assign("df", ., envir = .GlobalEnv) %>%
transmute(tmp = paste0(car, " (", mpg, ")")) %>%
pull %>%
paste0(collapse = ", ")
https://stackoverflow.com/a/78341333/11732165 хранит df, тогда как многие другие этого не делают, последнее может показаться вам более естественным:
mtcars %>%
rownames_to_column(var = "car") %>%
sample_n(5) %>%
`<-`(df, .) %>%
paste0(.$car, " (", .$mpg, ")", collapse = ", ")
поскольку он просто передает стандартную функцию присваивания.
А если не очевидно:
... %$% paste0(car, " (", mpg, ")", collapse = ", ")