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
相关产品推荐
相关产品推荐

