Вставить имя переменной в mutate (dplyr) - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь создать переменную с помощью paste () в функции mutate_ () (dplyr).

Я пытаюсь адаптировать код с этим ответом ( dplyr - mutate: использовать имена динамических переменных ), но это не работает ...

NB: nameVarPeriod1 - это параметр функции .

nameVarPeriod1=A2
df <- df %>%
    group_by(segment) %>%
    mutate_((.dots=setNames(mean(paste0("Sum",nameVarPeriod1)), paste0("MeanSum",nameVarPeriod1))))

Возвращает предупреждение:

Warning message:
In mean.default(paste0("Sum", nameVarPeriod1)) :
  argument is not numeric or logical: returning NA

Как вычислить строку в paste0 как имя переменной?

Когда я заменяю paste0 этим, он работает нормально:

df <- df %>%
    group_by(segment) %>%
    mutate(mean=mean(SumA2))

DATA:

structure(list(segment = structure(c(5L, 1L, 4L, 2L, 2L, 14L, 
11L, 6L, 14L, 1L), .Label = c("Seg1", "Seg2", "Seg3", "Seg4", 
"Seg5", "Seg6", "Seg7", "Seg8", "Seg9", "Seg10", "Seg11", "Seg12", 
"Seg13", "Seg14"), class = "factor"), SumA2 = c(107584.9, 127343.87, 
205809.54, 138453.4, 24603.46, 44444.39, 103672, 88695.8, 64400, 
36815.82)), .Names = c("segment", "SumA2"), row.names = c(NA, 
-10L), class = c("tbl_df", "tbl", "data.frame"))

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Не уверен, какова ваша цель переименования суммарного имени столбца с исходными именами столбца.Но если вы ищете решение, в котором вы хотите иметь sum из нескольких столбцов и, следовательно, хотите переименовать их, тогда dplyr::mutate_at сделает это за вас.

library(dplyr)
df %>% group_by(segment) %>%
  mutate(SumA3 = SumA2) %>%     #Added another column to demonstrate 
  mutate_at(vars(starts_with("SumA")), funs(mean = "mean"))

#  segment  SumA2  SumA3 SumA2_mean SumA3_mean
# <fctr>   <dbl>  <dbl>      <dbl>      <dbl>
# 1 Seg5    107585 107585     107585     107585
# 2 Seg1    127344 127344      82080      82080
# 3 Seg4    205810 205810     205810     205810
# 4 Seg2    138453 138453      81528      81528
# 5 Seg2     24603  24603      81528      81528
# 6 Seg14    44444  44444      54422      54422
# 7 Seg11   103672 103672     103672     103672
# 8 Seg6     88696  88696      88696      88696
# 9 Seg14    64400  64400      54422      54422
# 10 Seg1     36816  36816      82080      82080
0 голосов
/ 01 июня 2018

dplyr 0.7.0 и более не требует использования mutate_.Вот решение, использующее := для динамического присвоения имен переменных и вспомогательных функций quo name.

. Для получения дополнительной информации будет полезно прочитать vignette("programming", "dplyr").См. Также dplyr - mutate: используйте имена динамических переменных для более старых версий dplyr.

df <- df %>%
  group_by(segment) %>%
  mutate( !!paste0('MeanSum',quo_name(nameVarPeriod1)) := 
mean(!!as.name(paste0('Sum',quo_name(nameVarPeriod1)))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...