R 索引data.table中的唯一值

R 索引data.table中的唯一值,r,data.table,R,Data.table,不确定如何用文字表达问题,但如何为data.table创建一个索引列,当出现不同的值时,每个组都会递增 这是MWE library(data.table) in.data <- data.table(fruits=c(rep("banana", 4), rep("pear", 5)),vendor=c("a", "b", "b", "c", "d", "d", "e", "f", "f")) 因此,它将每个供应商标记为1、2、3。。。在每个水果里。可能有一个非常简单的解决方案,但我被卡住

不确定如何用文字表达问题,但如何为data.table创建一个索引列,当出现不同的值时,每个组都会递增

这是MWE

library(data.table)
in.data <- data.table(fruits=c(rep("banana", 4), rep("pear", 5)),vendor=c("a", "b", "b", "c", "d", "d", "e", "f", "f"))

因此,它将每个供应商标记为1、2、3。。。在每个水果里。可能有一个非常简单的解决方案,但我被卡住了。

我有一些想法。可以使用嵌套的组计数器:

in.data[, w := setDT(list(v = vendor))[, g := .GRP, by=v]$g, by=fruits]
或者,创建一个运行ID,该ID取决于已排序的数据(感谢@eddi),看起来很浪费:

in.data[, w := rleid(vendor), by=fruits]
base-R方法可能是:

in.data[, w := match(vendor, unique(vendor)), by=fruits]

# or in base R ...

in.data$w = with(in.data, ave(vendor, fruits, FUN = function(x) match(x, unique(x))))

另一种方法可能是两个步骤:

DT = data.table(fruits=c(rep("banana", 4), rep("pear", 5)),vendor=c("a", "b", "b", "c", "d", "d", "e", "f", "f"))
DT
   fruits vendor
1: banana      a
2: banana      b
3: banana      b
4: banana      c
5:   pear      d
6:   pear      d
7:   pear      e
8:   pear      f
9:   pear      f
DT[, wanted:=.GRP, by="fruits,vendor"]  # step 1
DT
   fruits vendor wanted
1: banana      a      1
2: banana      b      2
3: banana      b      2
4: banana      c      3
5:   pear      d      4
6:   pear      d      4
7:   pear      e      5
8:   pear      f      6
9:   pear      f      6
DT[, wanted:=wanted-wanted[1]+1L, by="fruits"]  # step 2 (adjust)
DT
   fruits vendor wanted
1: banana      a      1
2: banana      b      2
3: banana      b      2
4: banana      c      3
5:   pear      d      1
6:   pear      d      1
7:   pear      e      2
8:   pear      f      3
9:   pear      f      3
> 
我在生产代码中对此进行注释的方式可能是:

DT[, wanted:=.GRP, by="fruits,vendor"]          # .GRP is simple group counter
DT[, wanted:=wanted-wanted[1]+1L, by="fruits"]  # reset vendor counter per fruit

如果希望给定水果中所有供应商的索引相同,则这是另一个选项:

in.data[, wanted := as.integer(factor(vendor, levels = unique(vendor))), by = fruits]

否则,如果您希望它在供应商每次变更时都打勾,那么从目前给出的答案来看,
rleid
是唯一有效的。

它有效!我这样添加它:in.data[,want.2:=in.data[,rleid(vendor),by=fruits][,V1]]。也许你可以写一个答案让我接受?谢谢!我自己永远也无法解决这个问题。值得注意的是,如果您在.data[6,vendor:='f']中这样做,第一个和第二个选项会产生不同的结果。我不确定哪一个是理想的结果。我计划在运行操作之前对数据进行排序,因此两者都会为我提供相同的结果。谢谢你的评论,我学到了很多。谢谢。我在生产中使用R,因此感谢您提供的示例。“data.table对我来说仍然很神奇,但我希望最终能理解它。”克里斯很高兴听到这个消息。看来你就快到了。很高兴看到一个好的MRE。@尽管如此,您的MRE在某些方面还是模棱两可的,这导致了混乱。MRE可以更好地包括不相邻的组,并说明期望的结果。
in.data[, wanted := as.integer(factor(vendor, levels = unique(vendor))), by = fruits]