我下面的数据框中有很多变量,
> 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!
谢谢!
答案 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)的转置方法显然需要较少的代码-但如果您需要更复杂的突变,至少这里有一个示例,说明如何以这种格式获取它。