如何在R中按列统计两行间不含NA的不匹配数(分组对比)
在R中分组统计两行样本的非NA不匹配比例
先把你的示例数据转换成R可处理的矩阵结构:
# 构造示例数据 sample_data <- matrix( c(0,1,1,2,NA,2,1,1, 1,1,1,2,1,1,1,1, 2,2,1,0,0,NA,0,0, 2,2,1,1,0,NA,0,0), nrow = 4, byrow = TRUE, dimnames = list(c("Sample1", "Sample1b", "Sample2", "Sample2b"), NULL) )
接下来编写函数处理每组两行的对比,再批量完成所有分组统计:
# 定义处理单组两行的函数 count_mismatch <- function(row1, row2) { # 筛选两行均非NA的有效列 valid_cols <- !is.na(row1) & !is.na(row2) # 统计有效列中数值不匹配的数量 mismatch_num <- sum(row1[valid_cols] != row2[valid_cols]) # 有效列总数 total_valid <- sum(valid_cols) # 返回"不匹配数/有效列数"的格式 return(paste(mismatch_num, total_valid, sep = "/")) } # 按每两行一组批量处理 group_indices <- seq(1, nrow(sample_data), by = 2) results <- lapply(group_indices, function(i) { count_mismatch(sample_data[i, ], sample_data[i+1, ]) }) # 给结果添加分组名称 names(results) <- sapply(group_indices, function(i) { paste(rownames(sample_data)[i], "&", rownames(sample_data)[i+1]) }) # 查看最终结果 results
运行后会得到符合预期的输出:
$`Sample1 & Sample1b` [1] "2/7" $`Sample2 & Sample2b` [1] "1/7"
代码说明
- 矩阵构造时用
byrow=TRUE保证数据和示例一致,行名对应样本标识。 count_mismatch函数先过滤掉含NA的列,再统计有效列中数值不等的数量,最后返回比例字符串。- 通过
group_indices获取每组起始行索引,用lapply批量处理所有分组,添加名称后结果更易读。
如果需要数值型的比例结果,只需把函数的return语句改成return(mismatch_num / total_valid)即可。
内容的提问来源于stack exchange,提问作者user95146
相关产品推荐
相关产品推荐

