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

使用R计算指定组列间正数值行的重叠计数

问题描述

现有一个8列6行的数值型data frame(含正负值),列分组规则为:S1、S2归属GroupA;S3、S4归属GroupB;S5、S6归属GroupC;S7、S8归属GroupD。需编写R代码完成以下计算:
对每一列,统计该列中值大于0的行里,同时在指定目标组的至少一列中值也大于0的行数,最终输出按四个组分组的统计结果。

输入数据

数值数据框

S1  S2  S3  S4  S5  S6  S7  S8
R1  2   1   2  -1  -3   5   4  -3 
R2  4  -6   1   2   1   2   1   5
R3  3   2  -3  -9  -5  -1   4   9
R4  4  -4  -4  -6   4  -7   6   6
R5  6  -5   2   2  -7  -6   7  -6
R6  4   4  -3   3  -2   3  -4   2

列分组规则

S1        S2       S3       S4       S5      S6      S7     S8
GroupA   GroupA  GroupB   GroupB   GroupC  GroupC  GroupD  GroupD

预期输出

S1   S2   S3  S4  S5  S6  S7  S8
Group A    6    3    3   3   2   3   5   4
Group B    4    2    3   3   1   3   3   2
Group C    4    1    2   2   2   3   3   3
Group D    6    3    3   3   2   3   5   5

规则示例说明

  • 示例1:S1与GroupB的统计值为4。原因是S1的6行值均大于0,其中R1、R2、R5、R6这4行在GroupB的S3或S4中至少有一列值大于0。
  • 示例2:S3与GroupD的统计值为3。原因是S3中R1、R2、R5行值大于0,且这些行在GroupD的S7或S8中至少有一列值大于0。

R代码实现

# 1. 构造输入数据框
df <- data.frame(
  S1 = c(2, 4, 3, 4, 6, 4),
  S2 = c(1, -6, 2, -4, -5, 4),
  S3 = c(2, 1, -3, -4, 2, -3),
  S4 = c(-1, 2, -9, -6, 2, 3),
  S5 = c(-3, 1, -5, 4, -7, -2),
  S6 = c(5, 2, -1, -7, -6, 3),
  S7 = c(4, 1, 4, 6, 7, -4),
  S8 = c(-3, 5, 9, 6, -6, 2),
  row.names = paste0("R", 1:6)
)

# 2. 定义列与组的映射关系
group_map <- c(
  S1 = "GroupA", S2 = "GroupA",
  S3 = "GroupB", S4 = "GroupB",
  S5 = "GroupC", S6 = "GroupC",
  S7 = "GroupD", S8 = "GroupD"
)

# 3. 按组整理对应列名
group_cols <- split(names(df), group_map)

# 4. 核心计算函数:统计单条列-组组合的符合条件行数
calc_matching_rows <- function(col_name, target_group, df, group_cols) {
  # 当前列值>0的行逻辑向量
  col_pos <- df[[col_name]] > 0
  # 目标组中至少一列值>0的行逻辑向量
  group_pos <- rowSums(df[, group_cols[[target_group]], drop = FALSE] > 0) > 0
  # 统计同时满足两个条件的行数
  sum(col_pos & group_pos)
}

# 5. 初始化结果矩阵
result_matrix <- matrix(
  NA,
  nrow = 4,
  ncol = 8,
  dimnames = list(
    c("Group A", "Group B", "Group C", "Group D"),
    names(df)
  )
)

# 6. 遍历填充结果矩阵
for (row_group in rownames(result_matrix)) {
  # 统一组名格式(去除空格,匹配group_map中的命名)
  target_group <- gsub(" ", "", row_group)
  for (col in colnames(result_matrix)) {
    result_matrix[row_group, col] <- calc_matching_rows(col, target_group, df, group_cols)
  }
}

# 7. 输出最终结果
print(result_matrix)

内容的提问来源于stack exchange,提问作者palomo11

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 07:25:36