如何统计R数据框中字符型列表格式观测值的元素数量?
问题描述
我有一个字符类型的列,观测值格式如下(示例代码):
df <- data.frame(observation = c('["Extra pillows and blankets", "Dishes and silverware", "Room-darkening shades", "Hot water kettle", "Ethernet connection", "Wifi", "Dedicated workspace", "Oven"]', '["Extra pillows and blankets", "Dishes and silverware", "Room-darkening shades", "Hot water kettle", "Ethernet connection", "Wifi", "Dedicated workspace", "Oven"]', '["Extra pillows and blankets", "Dishes and silverware", "Room-darkening shades", "Hot water kettle", "Ethernet connection", "Wifi", "Dedicated workspace", "Oven"]' ))
我的目标是统计每个观测值中列表的元素数量(以列表中的逗号作为分隔符)。尝试过转换为因子、列表,使用length和lengths函数等方法,都没能解决问题,请问该如何处理?
解决方案
方法1:JSON解析(最可靠)
你的观测值是标准JSON数组格式,用JSON解析工具转成列表后统计长度是最稳妥的方式,推荐使用jsonlite包:
# 未安装包时先执行:install.packages("jsonlite") library(jsonlite) # 解析字符串为列表,统计每个列表的元素数 df$element_count <- lengths(fromJSON(df$observation, simplifyVector = FALSE))
示例中每个观测值会返回结果8,完全匹配实际元素数量。
方法2:字符串处理(无需额外包)
如果不想依赖第三方包,可通过字符串操作实现:
# 用基础R函数实现 df$element_count <- sapply(df$observation, function(x) { # 去除首尾的方括号 cleaned_str <- substr(x, 2, nchar(x)-1) # 按`", "`分割后统计元素长度 length(strsplit(cleaned_str, '", "')[[1]]) })
或者用stringr包简化操作:
# 未安装包时先执行:install.packages("stringr") library(stringr) # 去除首尾括号后统计逗号分隔符数量,加1得到元素数 df$element_count <- str_count(str_remove_all(df$observation, "^\\[|\\]$"), '", "') + 1
⚠️ 注意:字符串处理方法依赖格式完全固定,如果元素本身包含", "这类字符,会导致统计错误,优先推荐JSON解析法。
内容的提问来源于stack exchange,提问作者Karine
相关产品推荐
相关产品推荐

