【问题标题】:How do I create occasion variable (time) for each ID?如何为每个 ID 创建场合变量(时间)?
【发布时间】:2016-04-01 11:51:36
【问题描述】:

我想创建变量“时间”,它基本上表示变量 ID 在每天出现的次数减 1。换句话说,计数滞后 1 并且一天中第一次出现 ID 应该留空。在给定日期第二次出现相同的 ID 应该是 1。

基本上,我想在下面的示例中创建“时间”变量。

ID Day Time Value
1  1        0
1  1    1   0
1  1    2   0
1  2        0
1  2    1   0
1  2    2   0
1  2    3   1
2  1        0
2  1    1   0
2  1    2   0

以下是我正在处理的代码。没有成功。

data$time<-data.frame(data$ID,count=ave(data$ID==data$ID, data$Day, FUN=cumsum))

【问题讨论】:

标签: r variables


【解决方案1】:

我们可以通过data.table 做到这一点。将'data.frame'转换为'data.table'(setDT(df1)),按'ID'、'Day'分组,我们得到行序列的lagshift(seq_len(.N)))并赋值(:= ) 它作为“时间”列。

library(data.table)
setDT(df1)[, Time := shift(seq_len(.N)), .(ID, Day)]
df1
#    ID Day Value Time
# 1:  1   1     0   NA
# 2:  1   1     0    1
# 3:  1   1     0    2
# 4:  1   2     0   NA
# 5:  1   2     0    1
# 6:  1   2     0    2
# 7:  1   2     1    3
# 8:  2   1     0   NA
# 9:  2   1     0    1
#10:  2   1     0    2

base R

with(df1, ave(Day, Day, ID, FUN= function(x)
        ifelse(seq_along(x)!=1, seq_along(x)-1, NA)))
#[1] NA  1  2 NA  1  2  3 NA  1  2

或者没有ifelse

with(df1, ave(Day, Day, ID, FUN= function(x) 
            NA^(seq_along(x)==1)*(seq_along(x)-1)))
#[1] NA  1  2 NA  1  2  3 NA  1  2

数据

df1 <- structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L), 
Day = c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L), Value = c(0L, 
0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L)), .Names = c("ID", "Day", 
"Value"), row.names = c(NA, -10L), class = "data.frame")

【讨论】:

    猜你喜欢
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 2018-10-28
    相关资源
    最近更新 更多