在R语言中对列表元素分组并统计出现次数的方法
针对大数据场景,我推荐几个高效的实现方案——从基础R工具到专门的高性能包都有,你可以根据自己的需求选择:
方案1:基础R的
table()函数(简单易用,中小数据足够) 这是最直接的原生方法,不需要额外安装包,中小数据量下完全够用:
l = list("Android", "iPhone", "Android", "iPhone", "iPhone") # 先把列表转成向量,再统计频次 freq_table = table(unlist(l)) # 提取唯一元素 a = names(freq_table) # 提取对应频次,转成数值向量 b = as.vector(freq_table)
运行后a就是c("Android", "iPhone"),b就是c(2, 3),完美匹配你的需求。不过如果数据量达到百万甚至千万级,这个方法的效率会不如专门的高性能包。
方案2:
data.table包(大数据场景首选,速度拉满) data.table是R里处理大数据的标杆工具,内存占用低、运算速度极快,非常适合你的大数据场景:
先安装包(如果还没装的话):
install.packages("data.table")
然后用下面的代码实现:
library(data.table) # 把列表转成data.table的一列 dt = data.table(item = unlist(l)) # 按item分组,统计每组的数量(.N是data.table内置的计数变量) result = dt[, .N, by = item] # 提取结果 a = result$item b = result$N
这个方法在处理超大数据时,性能比基础R好几个量级,而且代码也很简洁。
方案3:
dplyr包(tidyverse风格,可读性强) 如果你习惯tidyverse的语法风格,dplyr的实现也很高效,代码可读性拉满:
先安装包:
install.packages("dplyr")
然后实现:
library(dplyr) # 把列表转成tibble(增强版数据框) df = tibble(item = unlist(l)) # 用count函数直接分组统计频次 result = df %>% count(item) # 提取结果 a = result$item b = result$n
count()函数本质就是分组计数,代码非常直观。这个方法的性能略逊于data.table,但比基础R好很多,适合喜欢tidyverse生态的用户。
小提示:如果你的输入本身可以直接转成向量(比如列表里都是单一元素,没有嵌套),可以省略unlist()步骤,直接用向量作为输入,效率会更高哦!
内容的提问来源于stack exchange,提问作者alyssaeliyah
相关产品推荐
相关产品推荐

