如何轻松创建满足处理条件的组行数?

时间:2018-03-09 23:57:21

标签: r dataframe

我有一个分组的数据框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

2 个答案:

答案 0 :(得分:2)

你可以这样做,

with(df1, ave(d, id, FUN = function(i)sum(i == 0)))

答案 1 :(得分:2)

或者我们可以使用table

with(df1, table(id, !d)[,2][id])