基于分组变量生成带重复ID的Survey与Rep变量的dplyr实现问题
解决方案
修正Rep变量的代码
你之前的Rep变量分组条件错误,需求是按Year、Date、City分组统计行数,需调整分组逻辑:
- 若要生成组内每行对应的该组总行数(比如每组有2行,两行的Rep都是2),用:
df <- df %>% group_by(Year, Date, City) %>% mutate(Rep = n()) %>% ungroup()
- 若要生成组内的行序号(比如每组第1行是1,第2行是2),用:
df <- df %>% group_by(Year, Date, City) %>% mutate(Rep = row_number()) %>% ungroup()
生成Survey变量
要实现同组(Year、Date、City)内相同Floor分配相同ID,可通过对分组内的Floor进行连续编码,推荐两种方法:
方法1:按出现顺序分配ID
df <- df %>% group_by(Year, Date, City) %>% mutate(Survey = match(Floor, unique(Floor))) %>% ungroup()
该方法按Floor在分组内首次出现的顺序分配ID,相同Floor会得到相同的编号(如分组内Floor序列为A、A、B、B,对应Survey为1、1、2、2)。
方法2:按排序后分配ID
df <- df %>% group_by(Year, Date, City) %>% mutate(Survey = dense_rank(Floor)) %>% ungroup()
dense_rank()会对Floor排序后分配连续ID:字符型Floor按字母顺序排序,数值型按大小排序,相同Floor的ID保持一致。
合并高效写法
可将两个变量的生成合并为一次管道操作,减少重复分组:
df <- df %>% group_by(Year, Date, City) %>% mutate( Survey = match(Floor, unique(Floor)), # 替换为dense_rank(Floor)可切换排序后编码 Rep = n() # 替换为row_number()可生成组内行序号 ) %>% ungroup()
内容的提问来源于stack exchange,提问作者Gemma Galbraith
相关产品推荐
相关产品推荐

