gpt4 book ai didi

r - 根据 R 中其他列的变化增加列记录

转载 作者:行者123 更新时间:2023-12-04 03:54:32 26 4
gpt4 key购买 nike

当同一 session 的第一个 timestamp 与后续 timestamp 记录之间的差异更大时,我想将 1 添加到 session 列超过 10 个单位。

换句话说:
如果同一 session 中 timestamp 列中的间隔大于 10,则为特定 ID 的其余 session 加 1。所以我们不应该有相同的 session 其记录中的差距超过 10。
让我们说:

df<-read.table(text="
ID timestamp session
1 10 1
1 12 1
1 15 1
1 21 1
1 25 1
1 27 2
1 29 2
2 11 1
2 22 2
2 27 2
2 32 2
2 42 2
2 43 3",header=T,stringsAsFactors = F)

在上面的示例中,对于 ID==1,第 4 行(timestamp==21)中第一个记录(timestamp==10)的 session 间隔大于 10,因此我们添加1 至其余 session 。每当session号发生变化时,同一sassion中timestamp第一条记录的差值应小于10,否则加入session。

result:  

ID timestamp session
1 *10 1
1 12 1
1 15 1
1 *21 2 <-- because 21-10 >= 10 it add 1 to the rest of sessions in this ID
1 25 2
1 27 3
1 29 3
2 11 1
2 *22 2
2 27 2
2 *32 3 <-- because 32-22>= 10 it add 1 to the rest of session
2 *42 4 <-- because 42-32>=10
2 43 5

我如何在 R 中做到这一点?

最佳答案

也许自定义函数可能有助于计算累积总和并在达到阈值后重置。在这种情况下,如果您为函数提供 session 数据,它将提供一个结果,其中包括 session 的累积“偏移量”,但仅在 session 数未增加的行中。这解决了 ID 2 timestamp 22 的情况,其中差异 > 10,但 session 编号从 1 增加到 2。

library(tidyverse)

threshold <- 10

cumsum_with_reset <- function(x, session, threshold) {
cumsum <- 0
group <- 0
result <- numeric()
for (i in seq_along(x)) {
cumsum <- cumsum + x[i]
if (cumsum >= threshold) {
if (session[i] == session[i-1]) {
group <- group + 1
}
cumsum <- 0
}
result = c(result, group)
}
return (result)
}

df %>%
group_by(ID) %>%
mutate(diff = c(0, diff(timestamp)),
cumdiff = cumsum_with_reset(diff, session, threshold),
new_session = cumdiff + session)

函数改编自this solution .

输出

      ID timestamp session  diff cumdiff new_session
<int> <int> <int> <dbl> <dbl> <dbl>
1 1 10 1 0 0 1
2 1 12 1 2 0 1
3 1 15 1 3 0 1
4 1 21 1 6 1 2
5 1 25 1 4 1 2
6 1 27 2 2 1 3
7 1 29 2 2 1 3
8 2 11 1 0 0 1
9 2 22 2 11 0 2
10 2 27 2 5 0 2
11 2 32 2 5 1 3
12 2 42 2 10 2 4
13 2 43 3 1 2 5

关于r - 根据 R 中其他列的变化增加列记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64069332/

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