对于示例数据框:
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)重复该过程。
如果有人可以帮我解决这个问题,我会非常感激。
答案 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"]