R:累计统计该列值在其他列中出现的次数

标签 r cumsum

使用示例来描述我想要做的事情可能更容易......假设我有以下数据框:

id1 id2 var
1   2   a
2   3   b
2   1   a
3   2   a
2   3   a
4   2   a
3   1   b

您可以按如下方式生成

df <- data.frame(id1 = c(1,2,2,3,2,4,3),
                 id2 = c(2,3,1,2,3,2,1),
                 var = c('a','b','a','a','a','a','b'))

我想要 id2 在具有相同变量的 id1 中出现的次数的累积计数,所以我最终会得到

id1 id2 var count
1   2   a   0
2   3   b   0 
2   1   a   1
3   2   a   1
2   3   a   1
4   2   a   2
3   1   b   0

因此,第 3 行中的计数为 1,因为我们在第 3 行之前(第 1 行中)看到 id1 = 1 且 var = 'a' 一次,然后在第 4 行中,计数也为 1,因为我们看到 id1 = 2 且 var第 3 行中的“a”(我们只在第 4 行之前检查,因此不计算在第 5 行中看到的)。

如果我要检查 id1 出现在 id1 中的次数,我会做类似的事情

with(df, ave(id1 == id1, paste(id1, var), FUN = cumsum))

是否有一种快速简便的方法可以为 id2 执行此操作?

提前致谢

最佳答案

可能有更优雅的方法来做到这一点,但这可以完成工作。这里的关键是split<-功能。

df$count <- NA # This column must be added prior to calling `split<-`
               # because otherwise we can't assign values to it
split(df, df$var) <- lapply(split(df, df$var), function(x){
    x$count <- cumsum(sapply(1:nrow(x), function(i) x$id2[i] %in% x$id1[1:i]))
    x
})

结果如下。存在一些差异,因此要么您在手动构建所需结果时犯了一些错误,要么我误解了这个问题。

  id1 id2 var count
1   1   2   a     0
2   2   3   b     0
3   2   1   a     1
4   3   2   a     2
5   2   3   a     3
6   4   2   a     4
7   3   1   b     0

更新:

为了使这个答案完整并有效,这是我对您的解决方案的看法。本质上是一样的,但我认为 ave 更好、更易读。里面lapply .

df$count <- NA
split(df, df$var) <- lapply(split(df, df$var), function(x){
    hit <- sapply(1:nrow(x), function(i) x$id2[i] %in% x$id1[1:i])
    x$count <- ave(hit, x$id2, FUN=cumsum)
    x
})

关于R:累计统计该列值在其他列中出现的次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19491258/

相关文章:

r - 每个值每年的百分比

r - R中information.gain中公式的使用

python - 连续相同值的总和

python - Pandas:在每列的每个时间戳处找到非 NaN 记录的累积总和

在 data.table 中滚动 cumsum

r - 一次使用多个变量透视更长的时间

r - 在最终输出中显示 R markdown block

r - R开始消息包含在编译过程中

python - 具有不同聚合的不同列的 Groupby 与另一个数据集的 cumsum

python - 基于月份的累计列数