如何基于列名在R数据框中对重复列两两比较并替换值为NA?
需求
数据集包含多列,每个样本对应两组重复数据:
- 重复组1列名格式:
name_sample_1 - 重复组2列名格式:
name_sample_1_2
需对每对重复列执行规则:当其中一列非0、另一列为0时,将两列对应值都替换为NA。
示例
原始数据
| replicate_1 | replicate_1_2 |
|---|---|
| 0 | 0 |
| 750 | 0 |
| 0 | 850 |
| 650 | 950 |
处理后结果
| replicate_1 | replicate_1_2 |
|---|---|
| 0 | 0 |
| NA | NA |
| NA | NA |
| 650 | 950 |
数据说明
数据框表头列名均符合上述成对重复的命名规则。
解决方案(R语言)
方式1:Tidyverse风格(推荐)
适用于多组重复列批量处理,代码如下:
library(dplyr) library(tidyr) df <- your_data_frame # 替换为你的数据框名称 # 提取所有重复组的基础名称 base_names <- unique(sub("_1(_2)?$", "", colnames(df))) # 逐组处理每对列 for (name in base_names) { col1 <- paste0(name, "_1") col2 <- paste0(name, "_1_2") df <- df %>% mutate( across(c(col1, col2), ~if_else((!!sym(col1) == 0 & !!sym(col2) != 0) | (!!sym(col1) != 0 & !!sym(col2) == 0), NA_real_, .x)) ) }
方式2:基础R实现
无需额外包,代码如下:
df <- your_data_frame # 替换为你的数据框名称 # 按基础名称分组列名 col_groups <- split(colnames(df), sub("_1(_2)?$", "", colnames(df))) # 遍历每组列对 for (group in col_groups) { if (length(group) != 2) next col1 <- group[grepl("_1$", group)] col2 <- group[grepl("_1_2$", group)] # 定位需要替换的行 replace_idx <- (df[[col1]] == 0 & df[[col2]] != 0) | (df[[col1]] != 0 & df[[col2]] == 0) # 替换为NA df[replace_idx, c(col1, col2)] <- NA }
内容的提问来源于stack exchange,提问作者Julien Sade
相关产品推荐
相关产品推荐

