使用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
相关产品推荐
相关产品推荐

