如何操作具有不同值的数据帧的列从外部矢量(具有dplyr)(How can I manipulate

2019-09-26 08:59发布

在R,我想操纵(比如乘)与存储在向量适当命名值data.frame列(或data.frame,如果这是更容易)。

比方说,我想先summarise变量disphpwtmtcars数据集。

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 )应保持由乘法不变。

Answer 1:

我们也可以用做这个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


Answer 2:

我不知道,如果你能在做这个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 cylmultiplier并设置它等于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)
标签: r dplyr