在R中计算data.table中每组计数变量的比例[重复]。

问题描述 投票:1回答:3

我有以下数据。

dput(mydata)
structure(list(groupSize = structure(c(2L, 1L, 2L, 1L, 4L, 4L, 
3L, 3L, 2L, 2L, 1L, 1L, 3L, 3L, 4L, 4L, 2L, 2L, 1L, 1L, 3L, 3L, 
4L, 4L, 3L, 3L, 2L, 2L, 1L, 1L, 4L, 4L, 2L, 2L, 4L, 4L, 3L, 3L, 
1L, 1L), .Label = c("small", "intermediate", "large", "huge"), class = "factor"), 
    gender = structure(c(1L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 
    2L, 1L, 2L, 1L, 2L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 2L, 1L, 
    1L, 2L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, 
    1L), .Label = c("F", "M", "U"), class = "factor"), startYear = structure(c(1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
    4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L), .Label = c("2014", "2015", 
    "2016", "2017", "2018"), class = "factor"), count = c(7546, 
    3500, 5930, 7668, 18114, 13826, 11943, 10083, 147, 2791, 
    17158, 19389, 2063, 17901, 11007, 1660, 6660, 15198, 496, 
    18716, 17385, 12726, 11409, 4711, 16140, 244, 15251, 6485, 
    5014, 1104, 438, 10930, 15582, 15626, 2121, 6339, 135, 15432, 
    12263, 10607)), row.names = c(NA, -40L), class = c("data.table", 
"data.frame"))

我想计算一下每一年每个组别大小的男性和女性的比例。因此,我会得到例如,在2014年的groupsize "小 "有45%的女性和55%的男性。如何能做到这一点的data.table在R中?

r data.table
3个回答
5
投票

如果你要找比例,你可以做 。

library(data.table)
mydata[, prop := count/sum(count) * 100, by = .(startYear, groupSize)]


#       groupSize gender startYear count       prop
# 1: intermediate      F      2014  7546 55.9958445
# 2:        small      F      2014  3500 31.3395415
# 3: intermediate      M      2014  5930 44.0041555
# 4:        small      M      2014  7668 68.6604585
# 5:         huge      F      2014 18114 56.7125861
# 6:         huge      M      2014 13826 43.2874139
# 7:        large      F      2014 11943 54.2222828
# 8:        large      M      2014 10083 45.7777172
#....

3
投票

你可以得到比例 M 内容如下。

mydata[ , by = .(groupSize, startYear),
       .(pct_M = weighted.mean(gender == 'M', w = count))]
#        groupSize startYear      pct_M
#  1: intermediate      2014 0.44004156
#  2:        small      2014 0.68660458
#  3:         huge      2014 0.43287414
#  4:        large      2014 0.45777717
#  5: intermediate      2015 0.94996596
#  6:        small      2015 0.53052234
#  7:        large      2015 0.89666400
#  8:         huge      2015 0.86895082
#  9: intermediate      2016 0.69530607
# 10:        small      2016 0.97418280
# 11:        large      2016 0.42263625
# 12:         huge      2016 0.70775434
# 13:        large      2017 0.01489258
# 14: intermediate      2017 0.70164704
# 15:        small      2017 0.81954887
# 16:         huge      2017 0.96147080
# 17: intermediate      2018 0.49929505
# 18:         huge      2018 0.25070922
# 19:        large      2018 0.99132781
# 20:        small      2018 0.53620463

这相当于略显繁琐的。

mydata[ , by = .(groupSize, startYear),
       .(pct_M = sum(count[gender == 'M'])/sum(count))]

2
投票

计算,并以方便人类的形式,与 dcast():

library(data.table)
mydata[, .(gender, prop = count / sum(count)), by = .(startYear, groupSize)
       ][, dcast(.SD, startYear + groupSize ~ gender)]

#     startYear    groupSize           F          M
#  1:      2014        small 0.313395415 0.68660458
#  2:      2014 intermediate 0.559958445 0.44004156
#  3:      2014        large 0.542222828 0.45777717
#  4:      2014         huge 0.567125861 0.43287414
#  5:      2015        small 0.469477659 0.53052234
#  6:      2015 intermediate 0.050034037 0.94996596
#  7:      2015        large 0.103336005 0.89666400
#  8:      2015         huge 0.131049183 0.86895082
#  9:      2016        small 0.025817198 0.97418280
# 10:      2016 intermediate 0.304693934 0.69530607
# 11:      2016        large 0.577363754 0.42263625
# 12:      2016         huge 0.292245658 0.70775434
# 13:      2017        small 0.180451128 0.81954887
# 14:      2017 intermediate 0.298352963 0.70164704
# 15:      2017        large 0.985107422 0.01489258
# 16:      2017         huge 0.038529205 0.96147080
# 17:      2018        small 0.463795365 0.53620463
# 18:      2018 intermediate 0.500704947 0.49929505
# 19:      2018        large 0.008672191 0.99132781
# 20:      2018         huge 0.749290780 0.25070922

2
投票

Base R解决方案。

with(df, count/ave(count, groupSize, startYear, FUN = sum)) 
© www.soinside.com 2019 - 2024. All rights reserved.