在R语言中按date列分组后为每组添加统一编号标签
按date列分组赋予统一编号标签的解决方法
问题场景
需要按date列对数据分组,为每个分组赋予统一的编号标签,数据示例如下:
df <- data.frame(id = c("RM125","RM126","RM121","RM120","RM128","RM129","RM131","RM133","RM135","RM132"), date = c(rep("1110101",6),rep("1110102",4)))
期望输出中,所有相同date的行拥有一致的label编号。
原代码问题分析
你尝试的两段代码无法得到预期结果的原因:
df %>% group_by(date) %>% mutate(row_number()):row_number()是为每组内的行按顺序生成1、2、3...的序号,而非整个分组的统一编号。df %>% group_by(date) %>% mutate(group = match(date, unique(date))):分组后每组内的unique(date)仅包含当前组的日期值,因此match始终返回1,所有组的编号都会是1。
可行解决方法
方法1:使用dplyr的cur_group_id()(推荐)
cur_group_id()会直接为每个分组分配唯一的编号,适配dplyr管道操作:
library(dplyr) df_labeled <- df %>% group_by(date) %>% mutate(label = cur_group_id()) %>% ungroup() print(df_labeled)
方法2:base R的match()方法
无需分组,直接通过match匹配唯一日期的出现顺序生成编号:
df$label <- match(df$date, unique(df$date))
方法3:base R的因子转数值方法
将date转为因子后再转为数值,自动按因子水平生成连续编号:
df$label <- as.numeric(factor(df$date))
以上三种方法都能得到符合预期的输出:
id date label 1 RM125 1110101 1 2 RM126 1110101 1 3 RM121 1110101 1 4 RM120 1110101 1 5 RM128 1110101 1 6 RM129 1110101 1 7 RM131 1110102 2 8 RM133 1110102 2 9 RM135 1110102 2 10 RM132 1110102 2
内容的提问来源于stack exchange,提问作者leslie
相关产品推荐
相关产品推荐

