我想将一个数据帧上的几列乘以一个向量的值(同一列内的所有值都应乘以相同的值,根据列的不同而有所不同),同时保持其他列不变。
因为我正在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)
(请注意,这是一个非常简单的数据框,原始的数据框具有更多的行和列的方式-不幸的是,它们没有以这种简单的方式标记,因此无法获得任何模式)
这里的问题是,您基本上是在尝试对行而不是列进行操作,因此诸如此类的方法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)
| 归档时间: |
|
| 查看次数: |
1900 次 |
| 最近记录: |