我想将所有数字列除以一个公共因子,在行的每个子集中使用不同的因子。
一个典型的例子是iris
数据集,如果我想将每个Species
的所有数字列除以不同的因子,例如
尝试拆分然后合并-提供因子列表;按组划分数据帧的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)))"
答案 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