R语言基于字符串列创建分组ID的实现方法
R语言dplyr实现同Name值匹配相同分组ID方案
你原有代码框架里用row_number()的思路不对,这个函数是给分组内的每一行按顺序生成递增行号,同组的多条记录会得到不同的序号,没法满足同Name对应相同ID的要求。
最贴合你现有写法的实现
你已经完成了group_by(Name)的分组步骤,直接调用dplyr内置的cur_group_id()即可,这个函数会自动为每个分组分配从1开始的唯一整数ID,同组所有记录拿到的ID完全一致,ID分配顺序和Name值第一次出现的顺序对齐,和你给出的示例效果完全匹配:
df1 %>% group_by(Name) %>% mutate(ID = cur_group_id()) %>% ungroup() # 操作完成后建议解除分组,避免后续数据处理受分组规则干扰
运行后效果和示例完全一致:
| Name | ID |
|---|---|
| A09john | 1 |
| J43mary | 2 |
| B7you | 3 |
| A09john | 1 |
| J43mary | 2 |
| B7you | 3 |
更简洁的无分组写法
如果不想写分组步骤,也可以直接用match()匹配Name值在去重序列里的位置,得到的结果和上面写法完全一致:
df1 %>% mutate(ID = match(Name, unique(Name)))
注意:以上两种写法的ID分配规则都是「按Name值第一次在数据中出现的顺序从1开始编号」,如果需要按Name的字典序分配ID,只需要在分组前先把Name列转为因子并按字典序排序水平即可。
内容的提问来源于stack exchange,提问作者Susan
相关产品推荐
相关产品推荐

