我有以下data.table
year Person Number_of_visits 2012 1 0 2013 1 4 2014 1 0 2015 1 1 2012 2 1 2013 2 5 ...
我想确定每个人,他们的第一次访问是哪一年.所以期望的输出是:
year Person Number_of_visits New? 2012 1 0 NA 2013 1 4 Yes 2014 1 0 No 2015 1 1 No 2012 2 1 NA 2013 2 5 No
我想也许可以在data.table中使用SHIFT函数,但我无法弄清楚如何这样做.一旦一个人访问过,他/她就不再是新人了,即使可能有一年之后没有访问.如果第一次访问发生在2012年,则应该有NA或类似条目.
我用过
test <- DT[ , NEW := c(0, (2:1)[(Number_of_visits== shift(Number_of_visits)) + 1][-1]), by = Person]
但这自然给了我所有的变化,我想只注册从0到0以上的某个值(访问次数)的第一个变化
我会将其分解为以下步骤(我确信解决方案可以打高尔夫球到更短的时间)
setorder(dt, Person, year) # Make sure the order is correct dt[, New := "No"] # Set No as default dt[dt[, .I[which.max(Number_of_visits > 0)], by = Person]$V1, New := "Yes"] # find first visits dt[year == 2012, New := NA_character_] # Set NAs to 2012 dt # year Person Number_of_visits New # 1: 2012 1 0 NA # 2: 2013 1 4 Yes # 3: 2014 1 0 No # 4: 2015 1 1 No # 5: 2012 2 1 NA # 6: 2013 2 5 No