R - base::interaction 字符变量的更快解决方案?

R - Faster solutions for base::interaction with character variables?

考虑以下模拟数据:

df <- data.frame(a=c("John", "Susan", "Eric", "John", "Susan"), 
                 b=c("K", NA, "J", "K", "S"), 
                 c=c("Smith", "Johnson", "May", "Smith", "Johnson"))
df$a <- as.character(df$a)
df$b <- as.character(df$b)
df$c <- as.character(df$c)

看起来像这样:

> df
      a    b       c 
1  John    K   Smith 
2 Susan <NA> Johnson 
3  Eric    J     May 
4  John    K   Smith  
5 Susan    S Johnson  

我生成了一个名为 unique 的列,其中包含关于三个字符变量交互的唯一数字。

如果列 bNA,我使用 ifelse 语句仅与列 ac 交互。

df$unique <- NA
df$unique <- ifelse(is.na(df$b), 
             as.integer(interaction(df$a, df$c)),
             as.integer(interaction(df$a, df$b, df$c)))

这导致:

> df
      a    b       c unique
1  John    K   Smith     23
2 Susan <NA> Johnson      3
3  Eric    J     May     10
4  John    K   Smith     23
5 Susan    S Johnson      9

当我使用此代码在包含数百万行的真实数据中构造 unique 变量时,此计算运行了 21 小时。

有没有办法加快这种性能?有更聪明的解决方案吗?

ifelse 语句是这里的瓶颈吗?

这行得通吗?

library(data.table)
dt1 <- as.data.table(df)
dt1[, unique := .GRP, by = names(dt1)]

       a  b       c unique
1:  John  K   Smith      1
2: Susan NA Johnson      2
3:  Eric  J     May      3
4:  John  K   Smith      1
5: Susan  S Johnson      4