首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据R中其他列的更改来增加列记录

根据R中其他列的更改来增加列记录
EN

Stack Overflow用户
提问于 2020-09-26 02:11:36
回答 1查看 39关注 0票数 3

当同一会话的第一个timestamp和随后的timestamp记录之间的差异超过10个单位时,我想在session列中添加1。

换句话说:

如果在同一个会话中,timestamp列的间隔大于10,那么对于特定的ID,将1加到其余的会话中。因此,我们不应该有相同的session,并且其记录中的间隔不应该大于10。

让我们说:

代码语言:javascript
复制
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)的会话间隔大于10,因此我们将其余会话加1。每次会话号改变时,时间戳的第一条记录的差值应在相同的情况下小于10,否则应添加到会话中。

代码语言:javascript
复制
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中做呢?

EN

回答 1

Stack Overflow用户

发布于 2020-09-26 05:12:12

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

代码语言:javascript
复制
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的函数。

输出

代码语言:javascript
复制
      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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64069332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档