我有一组包含物品的订单以及它们的来源。我需要为商品和供应商添加一个唯一的每个订单柜台。请注意,此唯一计数器是每个订单的唯一计数器。
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')
输出应该类似于这个表:
Order Item ItemNum Source SourceNum
1 100 1 Supplier1 1
1 101 2 Supplier1 1
1 102 3 Supplier2 2
1 106 4 Supplier3 3
2 107 1 Supplier4 1
2 108 2 Supplier4 1
3 104 1 Supplier5 1
3 103 2 Supplier6 2
答案 0 :(得分:1)
请考虑使用group_by
和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
答案 1 :(得分:1)
为了完整起见,这里还有一个data.table
解决方案:
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
答案 2 :(得分:0)
使用ave函数的可能解决方案:
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$Source
和df$Item
是字符(而不是因素)。