如何对含列表型观测的两个变量生成频数表?
问题描述
处理的dataframe包含两个变量,每个观测可能包含多个值。想要生成这两个变量的频数表,但table()函数无法处理list类型的列。
示例数据构建代码
col_a <- c("a", "b", "c", "a,b", "b,c") col_b <- c("c", "b", "a", "a,a", "a,c") df <- data.frame(col_a, col_b) df <- df %>% mutate(col_a = strsplit(df$col_a, ","), col_b = strsplit(df$col_b, ",") )
运行后的数据结构
col_a col_b 1 a c 2 b b 3 c a 4 c("a", "b") c("a", "a") 5 c("b", "c") c("a", "c")
报错信息
调用table(df$col_a, df$col_b)时出现以下错误:
Error in order(y) : unimplemented type 'list' in 'orderVector1'
期望的展开后数据格式
col_a col_b 1 a c 2 b b 3 c a 4 a a 5 a a 6 b a 7 b a 8 b a 9 b c 10 c a 11 c c
解决方案
可以通过将每行的list元素展开为所有可能的配对组合,再生成频数表,以下提供两种实现方式:
方法1:使用dplyr + tidyr(推荐)
library(dplyr) library(tidyr) # 展开数据为期望格式 expanded_df <- df %>% rowwise() %>% mutate(pairs = list(expand_grid(col_a = col_a, col_b = col_b))) %>% unnest(pairs) %>% select(col_a, col_b) # 生成交叉频数表 freq_table <- table(expanded_df$col_a, expanded_df$col_b) print(freq_table)
方法2:基础R实现
# 逐行生成配对组合并合并 expanded_list <- lapply(1:nrow(df), function(i) { expand.grid(col_a = df$col_a[[i]], col_b = df$col_b[[i]], stringsAsFactors = FALSE) }) expanded_df <- do.call(rbind, expanded_list) # 生成频数表 freq_table <- table(expanded_df$col_a, expanded_df$col_b) print(freq_table)
内容的提问来源于stack exchange,提问作者Kyle_Rose
相关产品推荐
相关产品推荐

