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
,以防我将来使用它或类似功能。