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
的列,其中包含关于三个字符变量交互的唯一数字。
如果列 b
为 NA
,我使用 ifelse
语句仅与列 a
和 c
交互。
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
考虑以下模拟数据:
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
的列,其中包含关于三个字符变量交互的唯一数字。
如果列 b
为 NA
,我使用 ifelse
语句仅与列 a
和 c
交互。
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