作者:黄天元,复旦大学博士在读,热爱数据科学与开源工具(R),致力于利用数据科学迅速积累行业经验优势和科学知识发现,涉猎内容包括但不限于信息计量、机器学习、数据可视化、应用统计建模、知识图谱等,著有《R语言数据高效处理指南》。知乎专栏:R语言数据挖掘。邮箱:huang.tian-yuan@qq.com.欢迎合作交流。
继续对标dplyr最新特性dplyr 1.0.0: working across columns - Tidyverse,这里我们看如何对多个列进行汇总。这里推出summarise_vars这个函数,能够通过灵活选择的列来进行汇总计算。
library(pacman)
p_load(tidyfst)
starwars = dplyr::starwars
starwars %>% summarise_vars(is.character,uniqueN)
#> name hair_color skin_color eye_color gender homeworld species
#> <int> <int> <int> <int> <int> <int> <int>
#> 1: 87 13 31 15 5 49 38
starwars %>%
add_count_dt(species) %>%
filter_dt(n > 1) %>%
summarise_vars("sex|gender|homeworld",.func = uniqueN,by = species)
#> species gender homeworld
#> <char> <int> <int>
#> 1: Human 2 16
#> 2: Droid 2 3
#> 3: Wookiee 1 1
#> 4: Gungan 1 1
#> 5: <NA> 2 3
#> 6: Zabrak 1 2
#> 7: Twi'lek 2 1
#> 8: Mirialan 1 1
#> 9: Kaminoan 2 1
starwars %>%
add_count_dt(homeworld) %>%
filter_dt(n > 1) %>%
summarise_vars(is.numeric,mean,na.rm = T,by = homeworld)
#> homeworld height mass birth_year n
#> <char> <num> <num> <num> <num>
#> 1: Tatooine 169.8000 85.37500 54.64444 10
#> 2: Naboo 175.4545 64.16667 55.00000 11
#> 3: Alderaan 176.3333 64.00000 43.00000 3
#> 4: Kashyyyk 231.0000 124.00000 200.00000 2
#> 5: Corellia 175.0000 78.50000 25.00000 2
#> 6: <NA> 138.7500 82.00000 334.33333 10
#> 7: Kamino 208.3333 83.10000 31.50000 3
#> 8: Coruscant 173.6667 50.00000 91.00000 3
#> 9: Ryloth 179.0000 55.00000 48.00000 2
#> 10: Mirial 168.0000 53.10000 49.00000 2
通过上面的例子,我们明确:
1、summarise_vars自带分组参数,这样分组计算的效率更佳
2、tidyfst中不使用n_distinct函数,而是使用data.table中的uniqueN函数对独立值进行计数
3、tidyfst总是强调使用正则表达式进行列选择,这样更加高效。因此当你希望使用x/y/z三列的时候,推荐使用“x|y|z”来选择列。如果需要精确匹配,只要使用正则的“^”和“$”加以限定即可。比如要精确匹配“x”,那么就用“^x$|y|z”。
原文作者:;如有侵权,请联系管理员删除。