R 如何将唯一计数器列附加到数据帧

R 如何将唯一计数器列附加到数据帧,r,R,我有一套订单,里面有商品,以及它们的来源。我需要为每个订单为项目和供应商添加一个唯一的计数器。请注意,此唯一计数器是每个订单的唯一计数器 library('tidyverse') library('partitions') df <- read_table('Order Item Source 1 100 Supplier1 1 101 Supplier1 1 102 Supplier2 1 106 Supplier3 2 107 Supplier

我有一套订单,里面有商品,以及它们的来源。我需要为每个订单为项目和供应商添加一个唯一的计数器。请注意,此唯一计数器是每个订单的唯一计数器

library('tidyverse')
library('partitions')

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')

考虑使用
groupby
mutate

 df %>% group_by(Order) %>% 
     mutate(ItemNum = row_number(Source),
     SourceNum = cumsum(!duplicated(Source)))


 # A tibble: 8 x 5
 # Groups:   Order [3]
 Order  Item    Source ItemNum SourceNum
 <int> <int>     <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
df%>%分组依据(订单)%>%
突变(ItemNum=行数(源),
SourceNum=cumsum(!重复(源)))
#一个tibble:8x5
#分组:顺序[3]
订单项目源ItemNum SourceNum
1100供应商11
2 1 101供应商1 2 1
3 1 102供应商2 3 2
41106供应商3 4 3
52107供应商411
6 2 108供应商4 2 1
7 3 104供应商5 1 1
8 3 103供应商6 2 2
使用函数的可能解决方案:

df$ItemNum  <- ave(1:nrow(df),df$Order,FUN=function(x) as.integer(as.factor(df$Item[x]))) 
df$SourceNum <- ave(1:nrow(df),df$Order,FUN=function(x) as.integer(as.factor(df$Source[x]))) 

> df
  Order Item    Source ItemNum SourceNum
1     1  100 Supplier1       1         1
2     1  101 Supplier1       2         1
3     1  102 Supplier2       3         2
4     2  107 Supplier4       1         1
5     1  106 Supplier3       4         3
6     2  108 Supplier4       2         1
7     3  104 Supplier5       2         1
8     3  103 Supplier6       1         2

df$ItemNum为了完整起见,这里还有一个
数据表
解决方案:

library(data.table)
setDT(df)[, ItemNum := rowid(Order)][
  order(Source), SourceNum := rleid(Source), by = Order][]
library(data.table)
setDT(df)[, ItemNum := rowid(Order)][
  order(Source), SourceNum := rleid(Source), by = Order][]
   Order Item    Source ItemNum SourceNum
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