Pmax столбцов, заканчивающихся данной строкой - PullRequest
1 голос
/ 23 апреля 2019

Я хотел бы условно изменить новый столбец, представляющий 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)   

изменить: оба ответа очень ценятся. Ура!

Ответы [ 2 ]

2 голосов
/ 23 апреля 2019

Вот один из способов использования оператора unquote-splice.Мы можем 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 пакетом Представить (v0.2.1)

1 голос
/ 23 апреля 2019

Базовая версия 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))]))
...