将数字列从计数转换为比例的整洁方法

我只想将下面数据框中的数字行转换为按行比例。

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在我原来的措辞,所以我采取了略有不同的方法在这里。不过,可能有更好的方法来做到这一点,所以我愿意接受建议。


以上是将数字列从计数转换为比例的整洁方法的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>