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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 08:15:41