gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:47:38 26 4
gpt4 key购买 nike

使用示例描述我想做什么可能更容易...假设我有以下数据框:

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 中出现相同 var 的次数的累积计数,所以我最终会得到

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com