如何在R语言data frame的列表列中统计每行元素个数并新增列
解决列表列元素个数统计的问题
你遇到的报错是因为在mutate里直接用x2[[row_number()]]的写法不符合向量式操作逻辑——row_number()返回的是一个向量,而[[只能用来提取列表的单个元素,用向量索引就会触发递归层级错误。下面给你几个简单可行的解决方案:
方法1:用purrr::map_int(tidyverse推荐)
purrr包的map_int函数专门用来处理列表,会对列表列的每个元素单独应用length函数,返回整数向量,完美适配mutate的需求:
library(dplyr) library(purrr) df <- structure(list(x1 = 1:5, x2 = list(c("a", "b"), c("b", "c", "d"), c("a", "b"), c("a", "b"), c("a", "b"))), row.names = c(NA, -5L), class = c("tbl_df", "tbl", "data.frame")) df %>% mutate(x3 = map_int(x2, length))
输出结果:
# A tibble: 5 × 3 x1 x2 x3 <int> <list> <int> 1 1 <chr [2]> 2 2 2 <chr [3]> 3 3 3 <chr [2]> 2 4 4 <chr [2]> 2 5 5 <chr [2]> 2
方法2:用base R的sapply
如果不想加载额外包,base R的sapply也能实现同样效果,它会自动把列表的输出结果简化为向量:
df %>% mutate(x3 = sapply(x2, length))
方法3:用rowwise()按行计算
通过rowwise()把数据按行分组,这样length(x2)就会在每行的上下文里计算单个列表的长度,最后记得用ungroup()取消分组:
df %>% rowwise() %>% mutate(x3 = length(x2)) %>% ungroup()
这三种方法都能得到你想要的结果,其中map_int因为类型明确(返回整数向量),是tidyverse生态里更规范的写法。
内容的提问来源于stack exchange,提问作者AnilGoyal
相关产品推荐
相关产品推荐

