按组描述统计 - R

时间:2016-12-12 21:01:56

标签: r

我正在寻找一种通过R中的组号生成描述性统计数据的方法。我找到了另一个answer on here,它使用了dplyr,但是我遇到了太多问题而希望看到其他人可能推荐的替代品

我希望获得按group_id分组的收入的描述性统计信息。假设我有一个名为company的数据框:

group_id    company     revenue
1          Company A    200
1          Company B    150
1          Company C    300
2          Company D    600
2          Company E    800
2          Company F    1000
3          Company G    50
3          Company H    80
3          Company H    60

我想创建一个名为new_company的新数据框:

group_id    company revenue average min max   SD
1          Company A    200  217    150 300   62
1          Company B    150  217    150 300   62
1          Company C    300  217    150 300   62
2          Company D    600  800    600 1000  163
2          Company E    800  800    600 1000  163
2          Company F    1000 800    600 1000  163
3          Company G    50  63      50  80    12
3          Company H    80  63      50  80    12
3          Company H    60  63      50  80   12

同样,我正在寻找dplyr的替代品。谢谢

2 个答案:

答案 0 :(得分:1)

使用样本数据框

dd<-read.csv(text="group_id,company,revenue
1,Company A,200
1,Company B,150
1,Company C,300
2,Company D,600
2,Company E,800
2,Company F,1000
3,Company G,50
3,Company H,80
3,Company H,60", header=T)

你可以做一些奇特的事情,比如使用ave()来为不同的函数创建每行的所有值,然后将它与原始的data.frame结合起来。

ext <- with(dd, Map(function(x) ave(revenue, group_id, FUN=x), 
    list(avg=mean, min=min, max=max, SD=sd)))
cbind(dd, ext)
#   group_id   company revenue       avg min  max        SD
# 1        1 Company A     200 216.66667 150  300  76.37626
# 2        1 Company B     150 216.66667 150  300  76.37626
# 3        1 Company C     300 216.66667 150  300  76.37626
# 4        2 Company D     600 800.00000 600 1000 200.00000
# 5        2 Company E     800 800.00000 600 1000 200.00000
# 6        2 Company F    1000 800.00000 600 1000 200.00000
# 7        3 Company G      50  63.33333  50   80  15.27525
# 8        3 Company H      80  63.33333  50   80  15.27525
# 9        3 Company H      60  63.33333  50   80  15.27525

但实际上简单的dplyr命令会更容易。

dd %>% group_by(group_id) %>% 
  mutate(
    avg=mean(revenue), 
    min=min(revenue), 
    max=max(revenue), 
    SD=sd(revenue))

答案 1 :(得分:0)

我要使用的另一个功能是:来自“ psych”包的describeBy。

library(psych)    
description   <- describeBy(data.frame$variable_to_be_described, df$group_variable)