Есть ли способ индексировать различные столбцы, переменные и функции внутри mutate? - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть следующий фрейм данных со многими переменными,

> head(fit_dat[,c(1:3)])
         var_a                   var_b                        var_c
1         1.14                  2.3815                       1.0606
2         0.83                  1.5818                       1.2450
3         0.92                  1.8848                       1.0606
4         0.96                  1.4596                       1.0606
5         1.16                  0.9677                       1.0248
6         0.81                  2.4058                       1.1189

У меня также есть вектор с элементами, которые соответствуют каждой из переменных в моем фрейме данных по имени

> g[c(1:3)]
                                var_a 
                            1.4020096 
                                var_b
                            0.9118361 
                                var_c
                            1.2868801 

Я хочу изменить каждый столбец моего фрейма данных, не называя все его многочисленные столбцы, и я хочу сделать это динамически, чтобы имена переменных использовались внутри функции ~. Я пытаюсь сделать это со следующим, но это не работает. Как я могу сделать это без использования объединений, циклов или именования каждой переменной?

И вообще, мне было интересно, если я вставлю такую ​​функцию в mutate_all, что будет передано этой функции в одном из вычислений?

library(tidyverse)
fit_dat %>% mutate_all(list(z = ~ . * g[colnames(.)])) # this `colnames` call is the problem!

Спасибо!

Ответы [ 2 ]

0 голосов
/ 06 ноября 2019

Если вы хотите использовать tidyverse, ваши данные должны быть в формате tidy (long), чего ожидают его функции. Вот одно из решений:

fit_data %>% 
  mutate(id = row_number()) %>% 
  pivot_longer(1:3, names_to = "var", values_to = "fit") %>% 
  mutate(fit = fit * g[var]) %>% 
  pivot_wider(names_from = "var", values_from = "fit") %>% 
  select(-id)

Вам понадобится столбец id, чтобы развернуть его обратно в широкую форму, с которой он начинается (в противном случае он не будет знать, что делать с неуникальной переменнойимена). Tidyverse может быть не лучшим решением в этом случае - метод Ронака с транспонированием, очевидно, требует меньше кода - но если вам нужны более сложные мутации, здесь, по крайней мере, приведен пример того, как вы получите его в этом формате.

0 голосов
/ 06 ноября 2019

Если я вас правильно понял, вы хотите умножить все столбцы на соответствующий вектор. Вы можете сделать это непосредственно в базе R без использования каких-либо библиотек, взяв подмножество g на основе names из fit_dat и умножив его на fit_dat.

t(t(fit_dat) * g[names(fit_dat)])

#  var_a  var_b var_c
#1 1.598 2.1715 1.365
#2 1.164 1.4423 1.602
#3 1.290 1.7186 1.365
#4 1.346 1.3309 1.365
#5 1.626 0.8824 1.319
#6 1.136 2.1937 1.440

данные

fit_dat <- structure(list(var_a = c(1.14, 0.83, 0.92, 0.96, 1.16, 0.81), 
var_b = c(2.3815, 1.5818, 1.8848, 1.4596, 0.9677, 2.4058), 
var_c = c(1.0606, 1.245, 1.0606, 1.0606, 1.0248, 1.1189)), 
class = "data.frame", row.names = c("1", "2", "3", "4", "5", "6"))
g <- c(var_a = 1.4020096 , var_b = 0.9118361, var_c = 1.2868801)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...