R语言:计算嵌套列表各元素值占比并存储为数据框
解决方案
首先定义你的嵌套列表:
lst <- list( c('A', 'A', 'A'), c("A", "B"), c("A", "A", "B", "B", "B", "B"), c("A", "C", "C"), c("B", "A") )
步骤1:统一所有类型
先提取列表中出现的所有唯一类型,确保后续每个子列表的结果都覆盖这些类型:
all_types <- unique(unlist(lst))
步骤2:批量计算每个子列表的占比
遍历每个子列表,计算各类型的占比,补充缺失类型的占比为0,并指定保留的小数位数:
result_list <- lapply(lst, function(x) { # 计算当前子列表的频率表并转成占比 prop <- prop.table(table(x)) # 转成数据框并和全类型合并,缺失值补0 df <- merge(data.frame(type = all_types), as.data.frame(prop, stringsAsFactors = FALSE), by = "type", all.x = TRUE) df$Freq[is.na(df$Freq)] <- 0 # 保留4位小数(可根据需求调整位数) round(df$Freq, 4) })
步骤3:整理成目标数据框
把每个子列表的结果合并为列,设置列名为子列表序号:
final_df <- data.frame( type = all_types, do.call(cbind, result_list) ) colnames(final_df)[-1] <- as.character(1:length(lst))
最终结果
运行后得到的final_df就是你需要的格式:
type 1 2 3 4 5 1 A 1.0000 0.5000 0.3333 0.3333 0.5000 2 B 0.0000 0.5000 0.6667 0.0000 0.5000 3 C 0.0000 0.0000 0.0000 0.6667 0.0000
如果需要调整小数位数,修改round函数的第二个参数即可(比如改为2就会得到0.33、0.67这样的结果)。
内容的提问来源于stack exchange,提问作者Stephan
相关产品推荐
相关产品推荐

