在R,我想操纵(比如乘)与存储在向量适当命名值data.frame列(或data.frame,如果这是更容易)。
比方说,我想先summarise
变量disp
, hp
和wt
从mtcars
数据集。
vars <- c("disp", "hp", "wt")
mtcars %>%
summarise_at(vars, funs(sum(.))
(抛出group_by(cyl)
混进去,或者使用mutate_at
如果你想有更多的行)
现在我想通过给每个相乘所得的列具有特定值,
multiplier <- c("disp" = 2, "hp" = 3, "wt" = 4)
是否有可能把这些在中summarise_at
功能?
结果应该是这样的(我不希望有参考变量名,而直接到达那里):
disp hp wt
14766.2 14082 411.808
更新:
也许我MWE太微乎其微。 比方说,我想通过分组一data.frame做同样的操作cyl
mtcars %>%
group_by(cyl) %>%
summarise_at(vars, sum)
因此,该结果应该是:
cyl disp hp wt
1 4 2313.0 2727 100.572
2 6 2566.4 2568 87.280
3 8 9886.8 8787 223.956
更新2:
也许我还不够明确这里下去,但在data.frame列应在矢量的相应值(只有在矢量提到的那些列)相乘,所以如disp
应乘以2, hp
3和wt
4,所有其它变量(例如cyl
)应保持由乘法不变。
我们也可以用做这个map
从功能purrr
library(purrr)
mtcars %>%
summarise_at(vars, sum) %>%
map2_df(multiplier, `*`)
# disp hp wt
# <dbl> <dbl> <dbl>
# 1 14766.2 14082 411.808
对于更新的问题
d1 <- mtcars %>%
group_by(cyl) %>%
summarise_at(vars, sum)
d1 %>%
select(one_of(vars)) %>%
map2_df(multiplier[vars], ~ .x * .y) %>%
bind_cols(d1 %>% select(-one_of(vars)), .)
# cyl disp hp wt
# <dbl> <dbl> <dbl> <dbl>
#1 4 2313.0 2727 100.572
#2 6 2566.4 2568 87.280
#3 8 9886.8 8787 223.956
或者我们可以使用gather/spread
library(tidyr)
mtcars %>%
group_by(cyl) %>%
summarise_at(vars, sum) %>%
gather(var, val, -cyl) %>%
mutate(val = val*multiplier[match(var, names(multiplier))]) %>%
spread(var, val)
# cyl disp hp wt
# <dbl> <dbl> <dbl> <dbl>
#1 4 2313.0 2727 100.572
#2 6 2566.4 2568 87.280
#3 8 9886.8 8787 223.956
我不知道,如果你能在做这个summarise_at
功能,但是这是接近的替代...
library(dplyr)
library(purrr)
vars <- c("disp", "hp", "wt")
multiplier <- c("disp" = 2, "hp" = 3, "wt" = 4)
mtcars %>%
summarise_at(vars, sum) %>%
do(. * multiplier)
disp hp wt
1 14766.2 14082 411.808
**** **** REDUX
包括分组VAR cyl
在multiplier
并设置它等于1 @akrun's
map2_df
在这里所做的实际工作。
vars <- c("disp", "hp", "wt")
multiplier <- c("cyl" = 1, "disp" = 2, "hp" = 3, "wt" = 4)
mtcars %>%
group_by(cyl) %>%
summarise_at(vars, sum) %>%
map2_df(multiplier, ~ .x * .y)
cyl disp hp wt
<dbl> <dbl> <dbl> <dbl>
1 4 2313.0 2727 100.572
2 6 2566.4 2568 87.280
3 8 9886.8 8787 223.956
文章来源: How can I manipulate dataframe columns with different values from an external vector (with dplyr)