编一个方便复现的数据如下:
library(data.table)
df <- data.table(
id = c(1234, 1234, 1234, 1234, 5678, 5678, 5678),
date = c(
'2006-01-01', '2007-01-01', '2010-01-01', '2021-01-01', '2009-01-01', '2013-01-01', '2015-01-01'),
rank = c(1, 2, 3, 4, 1, 2, 3),
is_contain = c(0, 1, 1, 0, 1, 1, 0))
数据集中有四列数据,第一列是id,第二列是date,每个id可以对应多个date;第三列rank是按每个id名下date升序排列后得到的序号,第四列is_contain是一个条件。想要达到的效果是,增加一列,对is_contain=1
的数据按id分组后按date升序排序后得到序号,而is_contain=0
的数据在新列的值都为0或者其他不是序号的标识符,如下。
id date rank is_contain rank_new
1: 1234 2006-01-01 1 0 0
2: 1234 2007-01-01 2 1 1
3: 1234 2010-01-01 3 1 2
4: 1234 2021-01-01 4 0 0
5: 5678 2009-01-01 1 1 1
6: 5678 2013-01-01 2 1 2
我写的代码如下:
df$date <- as.Date(df$date)
df.1 <- df[is_contain == 1, ]
df.1.1 <- df.1[, by = id, rank_new := order(date)]
df.2 <- df[is_contain == 0, ]
df.2$rank_new <- 0
df.new <- rbind(df.1.1, df.2)
head(df.new[order(id,date),])
感觉自己写的有点麻烦,看看各位有无更简便些的解法?
解释一下我觉得麻烦的原因是,真实的业务数据会有大几百万条,拆出新表再合并的话有点占内存。