Pmax столбцов, заканчивающихся заданной строкой

#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))]))