将所有数字列除以一个公因子;不同行组的不同因子

时间:2020-09-14 15:51:13

标签: r dictionary dplyr purrr

我想将所有数字列除以一个公共因子,在行的每个子集中使用不同的因子。

一个典型的例子是iris数据集,如果我想将每个Species的所有数字列除以不同的因子,例如

  1. Setosa by 1
  2. Versicolor by 10
  3. 弗吉尼亚乘100

尝试拆分然后合并-提供因子列表;按组划分数据帧的iris数据集列表,在两个输入上映射,然后重新组合-但我无法正确映射

map_dfr(list(1,10,100), ~
              iris %>% 
              group_split(Species) %>% 
              mutate(across(where(is.numeric), ~x / .x)))

Error in UseMethod("mutate_") : 
  no applicable method for 'mutate_' applied to an object of class "c('vctrs_list_of', 'vctrs_vctr', 'list')"

或将map2用于两个列表输入:

map2(x = iris %>% group_split(Species),
     y = list(1,10,100), 
     function(x,y)
       mutate(across(where(is.numeric), .x / .y)))

Error: unexpected ')' in "       mutate(across(where(is.numeric), .x / .y)))"

1 个答案:

答案 0 :(得分:0)

这是map2的工作版本:

map2(.x = iris %>% group_split(Species),
     .y = list(1,10,100), 
     function(x, div) {
       mutate(x, across(where(is.numeric), ~ .x / div))
      })

主要变化是mutate()需要一个数据帧作为其第一个参数,因此mutate(x, ...)。我还将y重命名为div以避免混淆。我们有2个匿名函数... function(x, div)意味着我们有一个参数x作为数据帧,而div是每个除数。我们将x赋予mutate,然后第二个匿名函数(使用~表示)默认情况下需要使用.x(对于数字列),但需要使用{ {1}},因为它位于div函数中。

我不太喜欢上面的代码,因为它依赖于(x, div)列表与.y组的顺序相同。如果这是我的代码,我可能会使用查找表来代替它,这会更安全,因为现在物种和除数之间的关系是清晰且可检查的。

group_split