You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言统计数据框列表型ANIMALS列各元素的出现频率占比

R列表列元素频率占比统计解决方案

你之前用table(tab$ANIMALS)失效的核心原因是ANIMALS是列表类型列,table()不会自动展开列表内部的元素,只会将每个列表单元作为整体统计,因此无法得到单个动物的出现频率。


方法1:Base R实现

# 导入示例数据
tab <- structure(list(ANIMALS = list(character(0), 
    c("[CAT]", "[DOG]"), character(0), "[CAT]", 
    character(0), c("[CAT]", "[SHARK]", "[DOG]"
    )), query = c("A", "B", "C", "D", "E", "F")), row.names = 3:8, class = "data.frame")

# 展开列表列,移除元素前后的方括号
all_animals <- gsub("\\[|\\]", "", unlist(tab$ANIMALS))
# 计算频率占比,保留两位小数
freq_result <- prop.table(table(all_animals)) |> round(2)
# 转换为目标格式数据框
result <- as.data.frame(freq_result, responseName = "Freq")
colnames(result)[1] <- "ANIMALS"

输出结果:

ANIMALS Freq
1     CAT 0.50
2     DOG 0.33
3   SHARK 0.17

方法2:Tidyverse实现(dplyr+tidyr)

library(dplyr)
library(tidyr)

result <- tab |>
  # 展开列表类型的ANIMALS列
  unnest_longer(ANIMALS) |>
  # 过滤空值(对应原数据中ANIMALS为空的行)
  filter(!is.na(ANIMALS)) |>
  # 移除元素前后的方括号
  mutate(ANIMALS = gsub("\\[|\\]", "", ANIMALS)) |>
  # 统计各动物出现次数
  count(ANIMALS, name = "cnt") |>
  # 计算占比保留两位小数
  mutate(Freq = round(cnt / sum(cnt), 2)) |>
  # 保留需要的列
  select(ANIMALS, Freq)

运行后得到的result和预期输出完全一致。


内容的提问来源于stack exchange,提问作者chippycentra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 09:27:04