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