R语言dataframe多character列取值共现次数的统计方法
可直接运行的统计实现方案
前置处理
先从原始数据中筛出需要纳入统计的5个character类分类列,排除ID、card这类标识性的非统计列:
target_cols <- c("curf", "mas", "vac", "scho", "alco") df_sub <- d[, target_cols]
基于tidyverse的实现(适配当前tibble数据结构)
逐列配对统计取值共同出现的次数,输出格式完全匹配目标长表结构:
library(tidyverse) # 生成所有非重复的列对组合,避免重复统计(比如不同时计算curf-mas、mas-curf这类反向重复对) col_pairs <- combn(names(df_sub), 2, simplify = FALSE) # 逐列对完成计数 final_result <- map_dfr(col_pairs, function(pair) { # 生成两列所有取值的笛卡尔组合,保证未共同出现过的取值对也能被输出(计数为0) expand_grid( col1 = unique(df_sub[[pair[1]]]), col2 = unique(df_sub[[pair[2]]]) ) %>% mutate( No_of_Occurence = map2_int(col1, col2, function(val1, val2) { # 逐行匹配两列取值,统计满足条件的总行数 sum(df_sub[[pair[1]]] == val1 & df_sub[[pair[2]]] == val2) }) ) })
跑通后输出的前几行和目标格式完全对齐:
col1 col2 No_of_Occurence c11 m2_indo 4 c12 m2_indo 4 c08 m2_indo 0 c11 m3_every 0 c12 m3_every 0 c08 m3_every 2 c11 v_100 4 c12 v_100 0 c08 v_100 2 ... s_50 a2_thu 4
基础R版本实现(无需安装第三方包)
不加载额外依赖,用基础函数即可完成相同计算:
col_pairs <- combn(names(df_sub), 2, simplify = FALSE) final_result <- data.frame(col1 = character(), col2 = character(), No_of_Occurence = integer()) for(pair in col_pairs) { val_set1 <- unique(df_sub[[pair[1]]]) val_set2 <- unique(df_sub[[pair[2]]]) pair_grid <- expand.grid(col1 = val_set1, col2 = val_set2, stringsAsFactors = FALSE) pair_grid$No_of_Occurence <- mapply(function(v1, v2) { sum(df_sub[[pair[1]]] == v1 & df_sub[[pair[2]]] == v2) }, pair_grid$col1, pair_grid$col2) final_result <- rbind(final_result, pair_grid) }
可选调整
- 若不需要保留计数为0的未出现组合,在结果生成后加一行过滤即可:
final_result <- final_result[final_result$No_of_Occurence > 0, ] - 若需要统计所有列的反向配对(比如同时算curf-vac和vac-curf),给生成的列对追加反向版本再跑统计逻辑即可。
内容的提问来源于stack exchange,提问作者djourd1
相关产品推荐
相关产品推荐

