如何在R语言中高效为年龄序列创建分类标识变量?
高效生成连续年龄序列的分类变量
你已经迈出了关键的一步——用dplyr标记出了序列的中断点!接下来只需要对这些中断点做累加操作,就能得到想要的序列编号了,这里有两种简洁高效的实现方式:
方法一:基于你已有的brk变量优化
你的brk变量已经标记了序列中断的位置,但第一行因为没有前值所以是NA,我们只需要把第一行的brk设为1(因为它是第一个序列的起点),然后对brk做累加求和,就能得到连续的序列编号:
library(dplyr) df <- data.frame(year = 1980:2000, age = c(40:45, 31:40, 32:36)) df <- df %>% mutate( brk = case_when( row_number() == 1 ~ 1, # 第一个元素标记为新序列起点 age - lag(age) != 1 ~ 1, TRUE ~ 0 ), seq = as.character(cumsum(brk)) # 累加得到序列编号并转成字符型 )
方法二:一步到位的极简写法
如果不想保留中间的brk变量,可以直接利用diff()函数计算相邻年龄的差值,结合cumsum()一步生成序列编号,代码更紧凑:
df <- df %>% mutate(seq = as.character(cumsum(c(1, diff(age) != 1))))
原理说明:
diff(age)会计算每一行与前一行的年龄差,diff(age) != 1会返回一个逻辑向量,标记所有序列中断的位置- 我们在这个向量前面加一个
1,因为第一个元素本身就是第一个序列的起点 cumsum()会对这个向量累加求和:每遇到一个1(新序列起点),累加值就会加1,自然生成了连续的序列编号- 最后用
as.character()转换成你需要的字符类型
运行后得到的seq列就完全符合你的预期啦!
内容的提问来源于stack exchange,提问作者Antti
相关产品推荐
相关产品推荐

