R语言中如何正确统计数据框列表列各元素的条目数?
R语言统计数据框列表列各元素的条目数
问题根源
你之前用length(b)得到c列全为2的结果,本质是上下文匹配错误:在mutate的默认运算逻辑里,b指代的是整个列表列对象——这个列本身是包含2个一级元素(对应数据框2行)的列表,length()计算的是这个列表的总长度(即2),而非每一行对应的子列表的内部元素数量。
你可以在控制台直接运行length(df$b)验证,返回值确实为2,和你之前得到的c列数值完全一致。
正确实现方案
方案1:使用lengths()函数(推荐)
R专门提供了带复数s的lengths()函数,用于批量计算列表中每一个一级元素的内部子元素数量,是C层面实现的向量化运算,处理效率最高,完美适配列表列的统计场景。
如果你之前习惯用magrittr的%<>%管道,仅需把原来代码里的length(b)替换为lengths(b)即可:
df %<>% mutate(c = lengths(b))
运行后即可得到符合预期的结果:
a b c 1 1 1, 2, 3, 4 4 2 2 5, 6, 7, 8, 9, 10 6
如果仅使用基础R实现,仅需一行代码完成赋值:
df$c <- lengths(df$b)
方案2:逐行运算模式
如果需要使用普通的length()函数,可以通过rowwise()将运算上下文切换为逐行模式,此时每一行的b就对应当前行的子列表,而非整列对象:
df %>% rowwise() %>% mutate(c = length(b)) %>% ungroup()
注意:逐行运算完成后必须调用
ungroup()取消逐行分组,否则后续所有数据运算都会保持逐行处理的状态,大幅降低长数据的处理效率。
核心区别说明
- 普通
length():作用于列表对象时,返回列表的一级元素总个数 lengths():向量化返回列表中每个一级元素的内部子元素个数,无需手写循环,是列表列计数的首选工具
内容的提问来源于stack exchange,提问作者homechef
相关产品推荐
相关产品推荐

