如何为DataFrame按订单添加Item及Source的唯一计数器列
按订单为商品和供应商添加独立唯一计数器
我明白你的需求啦——要给每个订单里的商品按出现顺序加ItemNum,同时给每个订单里的供应商按首次出现的顺序加SourceNum(同一个订单里同一个供应商编号保持一致)。用tidyverse就能轻松搞定,咱们直接看解决方案:
注意:你代码里加载的
partitions包在这个需求中用不到,可以移除哦~
完整代码实现
library(tidyverse) # 读取你的订单数据(这里直接构造示例数据,也可以用你原有的read_table方式) df <- read_table('Order Item Source 1 100 Supplier1 1 101 Supplier1 1 102 Supplier2 1 106 Supplier3 2 107 Supplier4 2 108 Supplier4 3 104 Supplier5 3 103 Supplier6') # 核心处理逻辑 result_df <- df %>% group_by(Order) %>% mutate( # 每个订单内,Item按行顺序生成递增的ItemNum ItemNum = row_number(), # 每个订单内,按Source首次出现的顺序生成编号,同一Source编号保持一致 SourceNum = match(Source, unique(Source)) ) %>% ungroup() # 取消分组,恢复普通数据框结构 # 查看最终结果 print(result_df)
输出结果
# A tibble: 8 × 5 Order Item Source ItemNum SourceNum <dbl> <dbl> <chr> <int> <int> 1 1 100 Supplier1 1 1 2 1 101 Supplier1 2 1 3 1 102 Supplier2 3 2 4 1 106 Supplier3 4 3 5 2 107 Supplier4 1 1 6 2 108 Supplier4 2 1 7 3 104 Supplier5 1 1 8 3 103 Supplier6 2 2
代码逻辑说明
group_by(Order):按订单分组,确保所有计数都在单个订单内部独立计算,不会跨订单干扰ItemNum = row_number():在每个订单组内,按行的先后顺序生成从1开始的递增数字,完美匹配你需要的ItemNum规则SourceNum = match(Source, unique(Source)):unique(Source)会保留每个订单内供应商的首次出现顺序,match函数返回每个供应商在这个唯一列表中的位置,这样同一个供应商在同一个订单里会得到相同的编号,新出现的供应商编号自动递增
这样处理后就完全符合你期望的输出样式啦!
内容的提问来源于stack exchange,提问作者Rhys
相关产品推荐
相关产品推荐

