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

时间:2018-01-23 14:53:37

标签: 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 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

3 个答案:

答案 0 :(得分:1)

请考虑使用group_bymutate

进行尝试
 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$Sourcedf$Item是字符(而不是因素)。