将数字列从计数转换为比例的整洁方法
我只想将下面数据框中的数字行转换为按行比例。
df <- data.frame(
"id" = c("A", "B", "C", "D"),
"x" = c(1, 2, 3, 4),
"y" = c(2, 4, 6, 8)
)
所以 df$x[1] <- 应该转换为 .3333 并且 df$y[1] 应该是 .6666 等等。我想用整洁的代码动态地做到这一点,而不是按名称引用任何列,并忽略数据框中的任何非数字列。
我目前的尝试,基于阅读了一些类似的帖子,如下
df %>%
mutate_if(is.numeric, . / rowSums(across(where(is.numeric))))
这将返回以下错误: Error: across() must only be used inside dplyr verbs.
请帮忙!
回答
改写如下:
df %>%
mutate_if(is.numeric, ~ . / rowSums(select(df, where(is.numeric))))
输出:
id x y
1 A 0.3333333 0.6666667
2 B 0.3333333 0.6666667
3 C 0.3333333 0.6666667
4 D 0.3333333 0.6666667
编辑:如果你想要一个除了 dplyr 和 base 之外不使用任何其他包的答案,并且可以更容易地通过管道传输,这是另一个(hacky)解决方案:
df %>%
group_by(id) %>%
mutate(sum = as.character(rowSums(select(cur_data(), is.numeric)))) %>%
summarise_if(is.numeric, ~ . / as.numeric(sum))
在函数内引用当前数据通常dplyr方式(例如cur_data)似乎并没有很好地与打rowSums在我原来的措辞,所以我采取了略有不同的方法在这里。不过,可能有更好的方法来做到这一点,所以我愿意接受建议。