使用dplyr的向量在数据帧上的几列乘积

cca*_*ara 1 r dplyr

我想将一个数据帧上的几列乘以一个向量的值(同一列内的所有值都应乘以相同的值,根据列的不同而有所不同),同时保持其他列不变。

因为我正在dplyr广泛使用mutate_each,所以我认为使用函数可能会很有用,因此我可以同时修改所有列,但是我完全不了解该fun()部分的语法。

另一方面,我已阅读了此解决方案该解决方案简单易行,但仅适用于所有列,而不适用于选定的列。

到目前为止,这就是我所做的:

想象一下,我要乘的所有列df,但letters通过weight_df矢量如下:

df = data.frame(
  letters = c("A", "B", "C", "D"),
  col1 = c(3, 3, 2, 3),
  col2 = c(2, 2, 3, 1),
  col3 = c(4, 1, 1, 3)
)
> df
  letters col1 col2 col3
1       A    3    2    4
2       B    3    2    1
3       C    2    3    1
4       D    3    1    3
> 
weight_df = c(1:3)
Run Code Online (Sandbox Code Playgroud)

如果我select在应用之前使用,mutate_each我摆脱了letters列(如预期的那样),这不是我想要的(部分原因是向量不是按列而是按行应用!我想要相反的意思):

df = df %>% 
  select(-letters) %>% 
  mutate_each(funs(. * weight_df))
> df
  col1 col2 col3
1    3    2    4
2    6    4    2
3    6    9    3
4    3    1    3
Run Code Online (Sandbox Code Playgroud)

但是,如果我不选择任何特定的列,letters则会删除其中的所有值(顺便说一句,这很有意义),但这也不是我想要的(这部分原因是不按比例应用向量列基础,但每行基础!我想要相反):

df = df %>% 
  mutate_each(funs(. * issb_weight))
> df
  letters col1 col2 col3
1      NA    3    2    4
2      NA    6    4    2
3      NA    6    9    3
4      NA    3    1    3
Run Code Online (Sandbox Code Playgroud)

(请注意,这是一个非常简单的数据框,原始的数据框具有更多的行和列的方式-不幸的是,它们没有以这种简单的方式标记,因此无法获得任何模式)

Dav*_*urg 5

这里的问题是,您基本上是在尝试对行而不是列进行操作,因此诸如此类的方法mutate_*将不起作用。如果您对链接问题中提出的许多矢量化方法不满意,我认为使用tydeverse(并假定它letters是唯一标识符)的一种方法是先转换为长格式,然后逐组乘以一列,然后转换回到广度(尽管不要认为这会过分高效)

library(tidyr)
library(dplyr)

df %>% 
  gather(variable, value, -letters) %>%
  group_by(letters) %>%
  mutate(value = value * weight_df) %>%
  spread(variable, value)

#Source: local data frame [4 x 4]
#Groups: letters [4]

#     letters  col1  col2  col3
# *    <fctr> <dbl> <dbl> <dbl>
#   1       A     3     4    12
#   2       B     3     4     3
#   3       C     2     6     3
#   4       D     3     2     9 
Run Code Online (Sandbox Code Playgroud)