count*类特征统计的R方法及耗时对比

count*特征在kaggle比赛的特征工程中使用特别常见,其统计主要有如下几种方法:
1. 使用add_count + rename组合——train1 <- mtcars %>% add_count(cyl,carb,vs,am,gear) %>% rename("count1"=n)
2. 使用group_by + mutate组合——train2 <- mtcars %>% group_by(cyl,carb,vs,am,gear) %>% mutate(count1 = n())
3. 针对data.table类型使用——train3[, count1:=.N, by=list(cyl,carb,vs,am,gear)]

当数据量很大时候,效率方法3 > 方法2 > 方法1

验证:

df <- data.frame(a = rpois(40,100),
       b = rpois(80,50),
       c = rnorm(1000000),
       d = rnorm(1000000))
df %>% head(10)

方法1

## method 1
invisible(gc())
df1 <- df
tic()
df1 <- df1 %>% add_count(a,b) %>% rename("no_a_b" = n) %>%
    add_count(a) %>% rename("no_a" = n)
toc()
head(df1)

结果:

0.307 sec elapsed

方法2

## method 2
invisible(gc())
df2 <- df
tic()
df2 <- df2 %>% group_by(a,b) %>% mutate(no_a_b = n()) %>%
    group_by(a) %>% mutate(no_a = n())
toc()
head(df2)

耗时

0.201 sec elapsed

方法3

invisible(gc())
df3 <- as.data.table(df)
tic()
df3[, no_a_b:=.N, by = list(a,b)]
df3[, no_a:=.N, by = list(a)]
toc()
head(df3)

耗时

0.079 sec elapsed

总结:当数据量较大时候,读入数据一般会使用data.table的fread函数,这时候特征工程建议使用方法3(速度快)和方法2(方便多特征同时管道操作)。

你可能感兴趣的:(R)