R мутирует новые столбцы на основе предыдущих и динамически присваивает им имена - PullRequest
0 голосов
/ 05 сентября 2018

Это не тот же вопрос, что и , это , а расширение. Какой самый быстрый способ создать несколько переменных на основе тех, которые вы создали в mutate, и динамически присваивать им имена. Э.Г.

library(dplyr)  
df<- data.frame(gg = rep(6:10),
                ba = rep(1:5))
df
  gg ba
1  6  1
2  7  2
3  8  3
4  9  4
5 10  5

желаемый вывод:

df_new
  gg ba diff.1 diff.2 sum_dif.1 sum_dif.2
1  6  1      5     10        25        50
2  7  2      5     10        25        50
3  8  3      5     10        25        50
4  9  4      5     10        25        50
5 10  5      5     10        25        50

После аналогичного вопроса, на который я ссылался, я могу получить diff.1 diff.2

myfun <- function(df, n) {
  varname <- paste("diff", n , sep=".")
  mutate(df, !!varname := (gg - ba)*n)
}

for(i in 1:2) {
  df <- myfun(df, n=i)
}

что дает

df
  gg ba diff.1 diff.2
1  6  1      5     10
2  7  2      5     10
3  8  3      5     10
4  9  4      5     10
5 10  5      5     10

Но не уверен, как передать сгенерированную переменную в другую строку в mutate, я подумал что-то вроде этого:

myfun <- function(df, n) {
  varname <- paste("diff", n , sep=".")
  varname2 <- paste("sum_dif", n , sep=".")
  mutate(df, !!varname := (gg - ba)*n,
             !!varname2 := sum(!!varname))
}

Также рады получить другие решения, может быть, data.table? Спасибо

1 Ответ

0 голосов
/ 05 сентября 2018

Нам нужно преобразовать строку в символ перед выполнением оценки (!!)

myfun <- function(df, n) {
 varname <- paste("diff", n , sep=".")
 varname2 <- paste("sum_dif", n , sep=".")
 mutate(df, !!varname := (gg - ba)*n,
         !!varname2 := sum(!! rlang::sym(varname)))
}

Теперь мы применяем myfun

for(i in 1:2) {
  df <- myfun(df, n=i)
 }

 df %>%
    select(gg, ba, matches('^diff'), matches('^sum'))
#   gg ba diff.1 diff.2 sum_dif.1 sum_dif.2
#1  6  1      5     10        25        50
#2  7  2      5     10        25        50
#3  8  3      5     10        25        50
#4  9  4      5     10        25        50
#5 10  5      5     10        25        50
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...