在R语言中为数据框列表列添加元素计数列的方法
解决列表列元素计数的问题
你遇到的错误根源在于:row_number()返回的是一个长度为5的整数向量,而x2[[row_number()]]这种写法试图用整个向量去索引列表的单个位置——列表的[[操作符只接受单个索引值,无法处理向量输入,这就导致了递归索引失败的报错。
这里有几个简单高效的解决方法:
方法1:使用purrr::map_int()(tidyverse风格推荐)
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))
方法2:使用base R的sapply()
如果你不想加载purrr包,sapply也能实现同样的效果,它会自动将结果简化为整数向量:
df %>% mutate(x3 = sapply(x2, length))
方法3:使用rowwise()(适合理解逐行操作逻辑)
如果你想保留类似原思路的逐行处理逻辑,可以用rowwise()让dplyr按行处理数据,此时直接对x2取长度即可:
df %>% rowwise() %>% mutate(x3 = length(x2)) %>% ungroup()
执行后都会得到你想要的输出:
# A tibble: 5 x 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
内容的提问来源于stack exchange,提问作者AnilGoyal
相关产品推荐
相关产品推荐

