У меня есть фрейм данных, в котором я хотел бы назначить максимальные значения динамически именованного столбца, сгруппированного по другому статическому столбцу. Я думаю, что лучший способ представить мою проблему - это пример.
Предположим, у меня есть следующий фрейм данных, my.events
:
x title typethx typesea
1 2016-11-24 Thanksgiving 1 0
2 2016-11-25 Thanksgiving 2 0
3 2016-11-26 Thanksgiving 3 0
4 2016-11-26 Season 0 1
5 2016-11-27 Season 0 2
Существует совпадение дат между двумя типами событий в 2016-11-26
. Поэтому я хочу сгруппировать по моему столбцу x
, а затем изменить столбцы type
до максимальных значений.
В статической реализации это будет записано как:
my.events <- my.events %>%
group_by(x) %>%
mutate(typethx = max(typethx),
typesea = max(typesea)) %>%
ungroup()
Результат будет выглядеть так:
x title typethx typesea
1 2016-11-24 Thanksgiving 1 0
2 2016-11-25 Thanksgiving 2 0
3 2016-11-26 Thanksgiving 3 1
4 2016-11-26 Season 3 1
5 2016-11-27 Season 0 2
Однако я бы хотел динамически изменять мои столбцы type
. Сначала я пытаюсь динамически изменить один столбец type
. В этом случае, скажем, я хочу применить свой mutate к typethx
, поэтому я создаю переменную name = "typethx"
. Теперь я попробовал метод SE, используя mutate_
, а также метод lazyeval
. Ни один из них не был успешным, что привело к ошибкам или неправильным выводам (мои попытки см. Ниже).
Попытка A:
new.events <- my.events %>%
group_by(x) %>%
mutate(!!name := max(!!name)) %>%
ungroup()
Результат A:
x title typethx typesea
<fctr> <fctr> <chr> <dbl>
1 2016-11-24 Thanksgiving typethx 0
2 2016-11-25 Thanksgiving typethx 0
3 2016-11-26 Thanksgiving typethx 1
4 2016-11-26 Season typethx 1
5 2016-11-27 Season typethx 2
Попытка B:
new.events <- my.events %>%
group_by(x) %>%
mutate_(lazyeval::interp(~name = max(name), name = as.name(name))) %>%
ungroup()
Результат B:
Error: unexpected '=' in "new.events <- my.events %>% group_by(x) %>% mutate_(lazyeval::interp(~name ="
Попытка C:
new.events <- my.events %>%
group_by(x) %>%
mutate_(lazyeval::interp(~name, name = as.name) = lazyeval::interp(~max(name), name = as.name(name))) %>%
ungroup()
Результат C:
Error: unexpected '=' in "new.events <- my.events %>% group_by(x) %>% mutate_(lazyeval::interp(~name, name = as.name) ="
Попытка D:
new.events <- my.events %>%
group_by(x) %>% mutate_(name = lazyeval::interp(~max(name), name = as.name(name))) %>%
ungroup()
Результат D:
x title typethx typesea name
<fctr> <fctr> <dbl> <dbl> <dbl>
1 2016-11-24 Thanksgiving 1 0 1
2 2016-11-25 Thanksgiving 2 0 2
3 2016-11-26 Thanksgiving 3 1 3
4 2016-11-26 Season 3 1 3
5 2016-11-27 Season 0 2 0
Бонусные баллы:
Я думал о том, чтобы пройтись по моим type
колонкам и сделать мутации, но если есть способ мутировать их всех сразу, то это было бы здорово. Просто для предварительного знания, эти type
столбцы были фиктивными переменными столбцами, которые я создал на предыдущем шаге. Ради сохранения масштаба проблемы, вы можете смело предположить, что есть переменная с именем dummy.cols = c('typethx', 'typesea')
.