gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:46:03 25 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 中出现的次数的累积计数,所以我最终会得到

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/

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