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(方便多特征同时管道操作)。