Использование mutate_at для создания новых столбцов с использованием других столбцов в том же фрейме данных - PullRequest
2 голосов
/ 14 марта 2019

Окей, у меня проблемы с чем-то, что должно быть простым. Если у меня есть такой фрейм данных:

x <- data.frame(a = seq(1,3), b = seq(2,4), c = seq(3,5), d = seq(4,6), b2 = seq(5,7), c2 = seq(6,8), d2 = seq(7,9))

# a b c d b2 c2 d2
# 1 2 3 4 5  6  7
# 2 3 4 5 6  7  8
# 3 4 5 6 7  8  9 

Я хочу использовать mutate_at для создания новых столбцов на основе результатов b / b2, c / c2 и т. Д. Когда я пытаюсь:

myvars <- c(2:4)
dvars <- c(5:7)
x <- x %>%
mutate_at(vars(myvars), funs('_new' = vars(myvars) / vars(dvars)))

Я получаю сообщение об ошибке «Ошибка оценки: не числовой аргумент для двоичного оператора.»

Я также пытался использовать mapply, но не смог заставить его работать. Причина, по которой я хочу использовать mutate_at, заключается в том, что я хочу внести изменения в исходные столбцы на основе результата этого деления на следующем шаге.

Ответы [ 2 ]

2 голосов
/ 14 марта 2019

Вы можете напрямую сделать

x[myvars]/x[dvars]

#          b         c         d
#1 0.4000000 0.5000000 0.5714286
#2 0.5000000 0.5714286 0.6250000
#3 0.5714286 0.6250000 0.6666667

Я не уверен, что вы могли бы сделать это с mutate_at, однако вы можете использовать map2_df из purrr

purrr::map2_df(x[myvars], x[dvars], ~ .x/.y)

ИЛИ с mapply

mapply("/", x[myvars], x[dvars])
1 голос
/ 14 марта 2019

Мы можем сделать это в выражении, а затем вычислить с помощью parse_exprs из rlang

library(dplyr)
expr1 <- paste0(names(x)[myvars], "/", names(x)[dvars])
x %>% 
     mutate(!!! rlang::parse_exprs(expr1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...