我有一个分组的数据框df1
,在变量n0
中,我想计算每个组id
中没有处理d
的情况。首先是一些数据:
数据:
set.seed(100)
n <- 1000
df1 <- data.frame(a=rbinom(n, 1, .5),
b=sample(20:40, n, replace = TRUE),
c=sample(seq(3000, 4000, 100), n, replace = TRUE),
d=rbinom(n, 1, .13),
k=rbinom(n, 1, .88),
l=rbinom(n, 1, .075),
m=rbinom(n, 1, .05),
n=rbinom(n, 1, .3))
df1 <- with(df1, df1[order(c, b, a),])
df1$id <- cumsum(!duplicated(df1[, c("a","b","c")]))
df1$count <- with(df1, ave(a, id, FUN=length))
> tail(df1, 6)
a b c d k l m n id count
935 1 39 4000 0 1 0 0 1 407 4
946 1 39 4000 0 1 0 0 1 407 4
441 0 40 4000 0 1 0 1 0 408 1
247 1 40 4000 1 1 0 0 0 409 3
515 1 40 4000 0 1 0 0 0 409 3
717 1 40 4000 0 1 1 0 1 409 3
尝试:
接下来我的尝试对我来说似乎很麻烦。有没有更短的方法来做到这一点?最好留在基地R。
df1$n0 <- unlist(sapply(1:length(unique(df1$id)), function(x)
with(df1, rep(nrow(df1[id == x & d == 0, ]),
nrow(df1[id == x, ])))))
> tail(df1, 6)
a b c d k l m n id count n0
935 1 39 4000 0 1 0 0 1 407 4 4
946 1 39 4000 0 1 0 0 1 407 4 4
441 0 40 4000 0 1 0 1 0 408 1 1
247 1 40 4000 1 1 0 0 0 409 3 2
515 1 40 4000 0 1 0 0 0 409 3 2
717 1 40 4000 0 1 1 0 1 409 3 2
答案 0 :(得分:2)
你可以这样做,
with(df1, ave(d, id, FUN = function(i)sum(i == 0)))
答案 1 :(得分:2)
或者我们可以使用table
with(df1, table(id, !d)[,2][id])