Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将所有数值列除以一个公因数;不同行组的不同系数_R_Dictionary_Dplyr_Purrr - Fatal编程技术网

R 将所有数值列除以一个公因数;不同行组的不同系数

R 将所有数值列除以一个公因数;不同行组的不同系数,r,dictionary,dplyr,purrr,R,Dictionary,Dplyr,Purrr,我想用一个公共因子来划分所有数值列,在每个行子集中使用不同的因子 一个典型的例子是iris数据集,如果我想将每个物种的所有数值列除以不同的因子,例如 刚毛1 花色10 维吉尼亚100 尝试拆分然后合并-提供因素列表;将数据帧的数据集列表按组拆分,映射到两个输入上,然后重新组合-但我无法获得正确的映射 map_dfr(list(1,10,100), ~ iris %>% group_split(Species) %>%

我想用一个公共因子来划分所有数值列,在每个行子集中使用不同的因子

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

  • 刚毛1
  • 花色10
  • 维吉尼亚100
  • 尝试拆分然后合并-提供因素列表;将数据帧的数据集列表按组拆分,映射到两个输入上,然后重新组合-但我无法获得正确的映射

    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)))"
    
    

    这是一个使用
    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
    。我们有两个匿名函数。。。
    函数(x,div)
    意味着我们有一个参数
    x
    ,它是数据帧,
    div
    是每个除数。我们将
    x
    赋予
    mutate
    ,然后第二个匿名函数(使用
    ~
    符号)需要默认使用
    .x
    (对于数字列),但需要使用
    div
    ,因为它位于
    (x,div)
    函数中

    我真的不喜欢上面的代码,因为它依赖于
    .y
    列表与
    group\u 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,这非常好-同意简单的
    左连接/变异
    是更干净的代码,错误映射错误因子到错误数据子集的可能性更小&我将使用这种方法。我太注重地图了-新鲜的眼睛总是很有帮助:)谢谢你对
    map2
    调用的解释,从
    .x
    中排序
    x
    ,以防我将来使用它或类似功能。