2017-06-22 97 views
0

考虑下面的模拟数据:R - base ::与字符变量交互的更快解决方案?

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列,它保存的三个字符变量之间的相互作用的唯一编号。

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

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声明是瓶颈吗?

回答

1

这项工作?

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 
相关问题