在R中按组给出百分比

时间:2015-05-25 21:57:01

标签: r

对于示例数据框:

df1 <- structure(list(i.d = structure(1:9, .Label = c("a", "b", "c", 
                                                  "d", "e", "f", "g", "h", "i"), class = "factor"), group = c(1L, 
                                                                                                              1L, 2L, 1L, 3L, 3L, 2L, 2L, 1L), cat = c(0L, 0L, 1L, 1L, 0L, 
                                                                                                                                                       0L, 1L, 0L, NA)), .Names = c("i.d", "group", "cat"), class = "data.frame", row.names = c(NA, 
                                                                                                                                                                                                                                                -9L))

我希望在我的数据框(“pc.cat”)中添加一个额外的列,该列记录列ID中的百分比'1'与组ID变量。

例如,组1中有四个值(i.d是a,b,d和i)。值'i'是NA,所以现在可以忽略它。剩下的三个值中只有一个是1,因此百分比读数为33.33(至2 dp)。该值将填充到组中“1”的所有行旁边的列“pc.cat”中(即使是NA列)。然后对其他组(2和3)重复该过程。

如果有人可以帮我解决这个问题,我会非常感激。

3 个答案:

答案 0 :(得分:2)

这可以通过ave函数完成:

df1$pc.cat <- ave(df1$cat, df1$group, FUN=function(x) 100*mean(na.omit(x)))
df1
#   i.d group cat   pc.cat
# 1   a     1   0 33.33333
# 2   b     1   0 33.33333
# 3   c     2   1 66.66667
# 4   d     1   1 33.33333
# 5   e     3   0  0.00000
# 6   f     3   0  0.00000
# 7   g     2   1 66.66667
# 8   h     2   0 66.66667
# 9   i     1  NA 33.33333

答案 1 :(得分:2)

library(data.table)

setDT(df1)


df1[!is.na(cat), mean(cat), by=group]

答案 2 :(得分:1)

使用data.table:

library(data.table)
DT <- data.table(df1)
DT[, list(sum(na.omit(cat))/length(cat)), by = "group"]