#r #dplyr #tidyr
#r #dplyr #tidyr
Вопрос:
Я хотел бы условно изменить новый столбец, представляющий pmax()
столбцы, заканчивающиеся на «_n» для данной строки. Я знаю, что могу сделать это, явно указав имена столбцов, но я бы предпочел, чтобы это было результатом вызова ends_with()
или подобного.
Я пробовал mutate_at()
и просто mutate()
. Моя общая мысль заключается в том, что мне нужно передать vars(ends_with("_n"))
чему-то, но я просто что-то упускаю.
Заранее спасибо.
library(dplyr)
library(tidyr)
mtcars %>%
group_by(vs, gear) %>%
summarize(mean = mean(disp),
sd = sd(disp),
n = n()) %>%
mutate_if(is.double, round, 1) %>%
mutate(mean_sd = paste0(mean, " (", sd, ")")) %>%
select(-mean, -sd) %>%
group_by(vs, gear) %>%
nest(n, mean_sd, .key = "summary") %>%
spread(key = vs, value = summary) %>%
unnest(`0`, `1`, .sep = "_")
gear `0_n` `0_mean_sd` `1_n` `1_mean_sd`
<dbl> <int> <chr> <int> <chr>
1 3 12 357.6 (71.8) 3 201 (72)
2 4 2 160 (0) 10 115.6 (38.5)
3 5 4 229.3 (113.9) 1 95.1 (NA)
редактировать: оба ответа высоко ценятся. Приветствия!
Комментарии:
1. В mtcars нет переменной, заканчивающейся на
_n
. Что именно вы имеете в виду, заканчиваясь_n
?2. После выполнения предоставленного мной кода создаются итоговые столбцы. Некоторые из них заканчиваются на «_n», чтобы указать количество.
Ответ №1:
Вот один из способов, использующий оператор сращивания без кавычек. Мы можем select
столбцы, которые мы хотим сравнить, а затем объединить их в виде векторов в pmax
:
library(tidyverse)
tbl <- structure(list(gear = c(3, 4, 5), `0_n` = c(12L, 2L, 4L), `0_mean_sd` = c("357.6 (71.8)", "160 (0)", "229.3 (113.9)"), `1_n` = c(3L, 10L, 1L), `1_mean_sd` = c("201 (72)", "115.6 (38.5)", "95.1 (NA)")), row.names = c(NA, -3L), class = c("tbl_df", "tbl", "data.frame"))
tbl %>%
mutate(pmax = pmax(!!!select(., ends_with("_n"))))
#> # A tibble: 3 x 6
#> gear `0_n` `0_mean_sd` `1_n` `1_mean_sd` pmax
#> <dbl> <int> <chr> <int> <chr> <int>
#> 1 3 12 357.6 (71.8) 3 201 (72) 12
#> 2 4 2 160 (0) 10 115.6 (38.5) 10
#> 3 5 4 229.3 (113.9) 1 95.1 (NA) 4
Создано 2019-04-23 пакетом reprex (версия 0.2.1)
Ответ №2:
Базовая версия R, просто как альтернатива:
tbl <- structure(list(gear = c(3, 4, 5), `0_n` = c(12L, 2L, 4L), `0_mean_sd` = c("357.6 (71.8)", "160 (0)", "229.3 (113.9)"), `1_n` = c(3L, 10L, 1L), `1_mean_sd` = c("201 (72)", "115.6 (38.5)", "95.1 (NA)")), row.names = c(NA, -3L), class = c("tbl_df", "tbl", "data.frame"))
tbl$pmax <- do.call(pmax,as.list(dat[,grepl("_n$",names(dat))]))