You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中按mid分组重新编号intersection/group_indices的结果?

解决R中按分组重新编号location字段的问题

我太懂这种被分组编号问题卡壳的滋味了!刚好你的需求很清晰:按mid分组,把location里的非零值替换成连续的编号,零值保持不变,同时还要保留原有非零值的出现顺序和对应关系。下面用两种常用的方法帮你搞定:

方法一:用dplyr的row_number()精准定位

这种方法逻辑直观,先在分组内筛选出非零的行,给它们按出现顺序分配编号,零值直接保留:

# 加载dplyr包(如果没安装先运行install.packages("dplyr"))
library(dplyr)

# 你的示例数据
t <- data.frame(
  mid=c(102,102,102,102,102,102,102,103,103,103,103,103,103,103),
  aid=c(10201,10202,10203,10204,10205,10206,10207,10301,10302,10303,10304,10305,10306,10307),
  dummy=c(0,1,0,1,0,1,0,0,1,0,1,0,1,0),
  location=c(0,2,0,4,0,1,0,0,2,0,2,0,3,0)
)

# 生成新的编号列
t_updated <- t %>%
  group_by(mid) %>%
  mutate(
    location_new = case_when(
      location != 0 ~ row_number()[location != 0],  # 给非零行按顺序编1、2、3...
      TRUE ~ 0                                      # 零值保持0
    )
  ) %>%
  ungroup()

# 查看结果
print(t_updated)

方法二:用cumsum()累加计数(更简洁)

如果追求代码简洁,用累计求和的思路也能实现——每遇到一个非零值就累加1,零值位置直接返回0:

t_updated <- t %>%
  group_by(mid) %>%
  mutate(
    location_new = ifelse(location != 0, cumsum(location != 0), 0)
  ) %>%
  ungroup()

结果验证

处理后的数据里,location_new列就是你要的效果:

  • 对mid=102的组,原来的非零值(2、4、1)会被替换成1、2、3,顺序完全和原数据一致;
  • 对mid=103的组,原来的非零值(2、2、3)会被替换成1、2、3,同样保留了出现顺序。

内容的提问来源于stack exchange,提问作者HSJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:49:46