有没有办法在mutate中为不同的列,变量和函数建立索引?

时间:2019-11-05 22:13:37

标签: r dynamic dplyr mutate

我下面的数据框中有很多变量,

> 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 :(得分:0)

如果我对您的理解正确,则希望将所有列与相应的向量相乘。您可以直接在基R中执行此操作,而无需使用任何库,只需根据g的{​​{1}}取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

答案 1 :(得分:0)

如果要使用tidyverse,则数据应采用整齐(长)格式,这是其功能所期望的。这是一种解决方案:

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可能不是最佳解决方案-罗纳克(Ronak)的转置方法显然需要较少的代码-但如果您需要更复杂的突变,至少这里有一个示例,说明如何以这种格式获取它。