使用R从列中提取序列:计算子串非空值最小计数及序列统计
解决R数据框按指定子串列分组的计数与组合统计问题
一、单个子串列组的非空存在性计数
针对列名包含APP/COP/PIN的列分组,计算每行中该组是否存在非空值(有则为1,全空则为0)。
示例数据框(模拟)
df <- structure(list( APP_1 = c(1, NA, 3), APP_2 = c(NA, 2, NA), COP_A = c(NA, NA, 5), COP_B = c(4, NA, NA), PIN_X = c(NA, 6, NA), PIN_Y = c(7, NA, 8), OtherCol = c("a", "b", "c") ), class = "data.frame", row.names = c(NA, -3L))
处理代码
# 定义目标子串 target_substrings <- c("APP", "COP", "PIN") # 按子串匹配列名并分组 col_groups <- lapply(target_substrings, function(sub) { grep(sub, colnames(df), value = TRUE) }) names(col_groups) <- target_substrings # 计算每组的非空存在性(1=有非空值,0=全空) result_single <- sapply(col_groups, function(cols) { as.integer(rowSums(!is.na(df[cols])) > 0) }) # 合并到原数据框(可选) df_single <- cbind(df, result_single)
输出示例
APP_1 APP_2 COP_A COP_B PIN_X PIN_Y OtherCol APP COP PIN 1 1 NA NA 4 NA 7 a 1 1 1 2 NA 2 NA NA 6 NA b 1 0 1 3 3 NA 5 NA NA 8 c 1 1 1
二、多子串组合的出现次数统计
1. 两两组合统计
统计APP+COP、APP+PIN、COP+PIN这类组合的出现频次:
# 生成所有两两组合 pair_combinations <- combn(target_substrings, 2, simplify = FALSE) names(pair_combinations) <- sapply(pair_combinations, paste, collapse = "+") # 计算每行组合的满足情况(同时存在非空值则为1) result_pairs <- sapply(pair_combinations, function(combo) { as.integer(rowSums(result_single[, combo]) == length(combo)) }) # 统计各组合的总出现次数 pair_counts <- colSums(result_pairs)
输出示例
APP+COP APP+PIN COP+PIN 2 3 2
2. 三个子串组合统计
统计APP+COP+PIN组合的出现次数:
# 计算每行是否三个组都有非空值 result_triple <- as.integer(rowSums(result_single) == length(target_substrings)) # 统计总次数 triple_count <- sum(result_triple)
输出示例
[1] 2
三、适配任意长度序列的通用解决方案
以下函数可处理任意数量的目标子串,自动生成所有长度的组合并统计频次:
count_combinations <- function(df, target_substrings) { # 第一步:计算单个子串的非空存在性结果 col_groups <- lapply(target_substrings, function(sub) grep(sub, colnames(df), value = TRUE)) names(col_groups) <- target_substrings result_single <- sapply(col_groups, function(cols) as.integer(rowSums(!is.na(df[cols])) > 0)) # 第二步:遍历所有组合长度(1到子串总数) all_counts <- list() for(k in 1:length(target_substrings)) { # 生成k长度的所有组合 combos <- combn(target_substrings, k, simplify = FALSE) combo_names <- sapply(combos, paste, collapse = "+") # 计算每个组合的满足情况并统计次数 combo_results <- sapply(combos, function(combo) { as.integer(rowSums(result_single[, combo]) == k) }) colnames(combo_results) <- combo_names all_counts[[paste0(k, "_length")]] <- colSums(combo_results) } return(all_counts) } # 调用示例(若新增子串"XYZ",需数据框含对应列) # target_substrings <- c("APP", "COP", "PIN", "XYZ") # all_stats <- count_combinations(df, target_substrings)
返回结果按组合长度分类,比如$1_length对应单个子串计数,$2_length对应两两组合计数,可无缝适配更长的子串序列。
内容的提问来源于stack exchange,提问作者Sandy
相关产品推荐
相关产品推荐

