【问题标题】:Divide all numeric columns by a common factor; different factor per different groups of rows将所有数字列除以一个公因数;每个不同行组的不同因子
【发布时间】:2020-09-14 15:51:13
【问题描述】:

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

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

  1. Setosa by 1
  2. 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)))"

【问题讨论】:

    标签: r dictionary dplyr purrr


    【解决方案1】:

    这是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(对于数字列)但需要使用div,因为它在@ 内987654335@函数。

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

    div = tribble(
      ~Species, ~factor,
      "setosa", 1,
      "versicolor", 10,
      "virginica", 100
    )
    
    iris %>% 
      left_join(div) %>%
      mutate(across(where(is.numeric), ~.x / factor)) %>%
      select(-factor)
    

    【讨论】:

    • 感谢@gregor-thomas,这太棒了——同意简单的left_join / mutate 是更简洁的代码,将错误因素映射到错误数据子集以及我将使用的方法的可能性更小。我太注重地图了——新鲜的眼睛总是有帮助的:)感谢map2调用的解释,在匿名函数中从.x中排序x,以防我将来使用它或类似的东西。
    猜你喜欢
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    • 1970-01-01
    相关资源
    最近更新 更多