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

如何对含列表型观测的两个变量生成频数表?

问题描述

处理的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 14:31:52