【问题标题】:Create bins based on values for each group in R根据 R 中每个组的值创建 bin
【发布时间】:2020-07-02 21:15:58
【问题描述】:

我有以下数据:

test1<- data.frame("ID"= c("1","1","1", "2","2","2","3"), "TimeElapsed"=c(0,10,40,0,40,12,0))

看起来像:

ID  TimeElapsed
1    0
1    10
1    40
2    0
2    40
2    12
3    0

我想创建箱/会话,这样每当自上次输入 ID 以来经过的时间超过 30 时,我都想为该 ID 启动一个新会话。我使用来自 dplyr 的以下代码。

test1<-test1 %>%
  group_by(ID) %>%
mutate(cut_session = (TimeElapsed > 30) + 1)

我得到这个结果:

ID  TimeElapsed Session
1    0            1
1    10           1 
1    40           2 
2    0            1  
2    40           2
2    12           1     <- Doesn't work for this case         
3    0            1 

我想要一个解决方案,因为经过的时间

【问题讨论】:

  • 能不能显示预期的

标签: r dplyr


【解决方案1】:

也许,只要逻辑值为 TRUE(TRUE/FALSE 为 1/0),我们就可以使用 cumsum 加 1。按'ID'分组后,得到逻辑向量的累积和

library(dplyr)
test1 %>%
  group_by(ID) %>%
  mutate(cut_session = cumsum(TimeElapsed > 30))

它如何与cumsum 一起工作?考虑一个逻辑向量

v1 <- c(TRUE, FALSE, TRUE, FALSE, FALSE)
cumsum(v1)
#[1] 1 1 2 2 2

每当它达到 TRUE 时,就会在前一个值上加 1,直到它达到下一个 TRUE 值

如果我们需要加1,那么使用

 cumsum(v1) + 1

这里,+ 是一个显式用于相加的符号,即获取两个对象在它的 lhs 和 rhs 上的总和。但是,当有 NA 时,它的行为会有所不同,即

NA + 1

返回不适用

【讨论】:

  • 谢谢,这正是我想要的。也谢谢你的描述
【解决方案2】:

在这里使用cumsum 是理想的选择。我已经修改了两行,只是为了向你展示发生了什么。

  1. TimeElapsed 30 多岁了吗?
  2. 累计超过30秒(加1使1为起始编号)
library(dplyr)

test1<- data.frame("ID"= c("1","1","1", "2","2","2","3"), "TimeElapsed"=c(0,10,40,0,40,12,0))

test1 %>% 
  group_by(ID) %>% 
  mutate(over30 = TimeElapsed > 30,
         cut_session = cumsum(over30) + 1)
#> # A tibble: 7 x 4
#> # Groups:   ID [3]
#>   ID    TimeElapsed over30 cut_session
#>   <chr>       <dbl> <lgl>        <dbl>
#> 1 1               0 FALSE            1
#> 2 1              10 FALSE            1
#> 3 1              40 TRUE             2
#> 4 2               0 FALSE            1
#> 5 2              40 TRUE             2
#> 6 2              12 FALSE            2
#> 7 3               0 FALSE            1

reprex package (v0.3.0) 于 2020 年 7 月 2 日创建

【讨论】:

  • 好的,但没有+ 1,也没有任何关于它在做什么的解释。 @hashingdata 是新发帖者,所以我认为他可能也是 R 的新手,因此一些解释会是有益的。
猜你喜欢
  • 1970-01-01
  • 2023-03-24
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多