gpt4 book ai didi

r - 在 dplyr 中按组获取总和后计算列的行百分比

转载 作者:行者123 更新时间:2023-12-02 05:08:41 25 4
gpt4 key购买 nike

使用dplyr我正在为两个类别生成一个简单的汇总表:

# Data
data("mtcars")
# Lib
require(dplyr)
# Summary
mt_sum <- mtcars %>%
group_by(am, gear) %>%
summarise(n = n()) %>%
spread(key = am, value = n)

这会产生所需的结果:

Source: local data frame [3 x 3]

gear 0 1
(dbl) (int) (int)
1 3 15 NA
2 4 4 8
3 5 NA 5

对于生成的表,我想添加一组具有行百分比而不是当前可用总计的列。

期望的结果

我希望我的 table 看起来像这样:

   gear     0     1   0per   1per
1 3 15 NA 100%
2 4 4 8 33% 67%
3 5 NA 5 100%

尝试

我尝试通过添加代码来实现以下目的:

mt_sum <- mtcars %>%
group_by(am, gear) %>%
summarise(n = n()) %>%
spread(key = am, value = n) %>%
mutate_each(funs(./rowSums(.)))

但它返回以下错误:

Error: 'x' must be an array of at least two dimensions

因此我的问题是:如何在 dplyr 中添加带有行百分比值的额外列?

侧面要点

  • 我更喜欢空白值而不是 NA
  • 可以使用 gmodels 中的 CrossTable 轻松构建表格,但我想留在 dplyr 中,因为我想保持在一个地方尽可能进行多种转换

最佳答案

我认为这就是您所需要的:

# Data
data("mtcars")
# Lib
require(dplyr)
require(tidyr)
require(scales) #for percent
# Summary
mtcars %>%
group_by(am, gear) %>%
summarise(n = n()) %>%
spread(key = am, value = n) %>%
#you need rowwise because this is a rowwise operation
rowwise %>%
#I find do to be the best function for ad-hoc things that
#have no specific dplyr function
#I use do below to calculate the numeric percentages
do(data.frame(.,
per0 = .$`0` / sum(.$`0`, .$`1`, na.rm=TRUE),
per1 = .$`1` / sum(.$`0`, .$`1`, na.rm=TRUE))) %>%
#mutate here is used to convert NAs to blank and numbers to percentages
mutate(per0 = ifelse(is.na(per0), '', percent(per0)),
per1 = ifelse(is.na(per1), '', percent(per1)))

输出:

Source: local data frame [3 x 5]
Groups: <by row>

gear X0 X1 per0 per1
(dbl) (int) (int) (chr) (chr)
1 3 15 NA 100%
2 4 4 8 33.3% 66.7%
3 5 NA 5 100%

关于r - 在 dplyr 中按组获取总和后计算列的行百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34069576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com