基于另一组列替换R数据框中多列数值
解决方法
针对需求,这里提供几种在R中实现用X组变量作为掩码,将对应X为0的Y组单元格替换为NA的方案:
示例数据
先定义输入数据:
library(tibble) input <- tibble(X1 = c(1,1,0,1), X2 = c(1,1,1,0), X3 = c(0,0,0,1), Y1 = c(1,0,1,1), Y2 = c(1,1,0,0), Y3 = c(0,0,0,0))
目标输出:
output <- tibble(Z1 = c(1,0,NA,1), Z2 = c(1,1,0,NA), Z3 = c(NA,NA,NA,0))
方法1:tidyverse工具链(dplyr + purrr)
适合批量处理多组X-Y变量,无需手动逐个定义列:
library(dplyr) library(purrr) # 提取X、Y列名 x_cols <- colnames(input)[grepl("^X", colnames(input))] y_cols <- colnames(input)[grepl("^Y", colnames(input))] # 成对处理X-Y列,生成Z列 output <- map2_dfc(x_cols, y_cols, ~ if_else(input[[.x]] == 1, input[[.y]], NA_integer_)) %>% rename_with(~ stringr::str_replace(.x, "Y", "Z"))
方法2:Base R矩阵运算
适合习惯原生R语法的用户,处理效率较高:
# 拆分X、Y为矩阵 x_mat <- as.matrix(input[, grep("^X", colnames(input))]) y_mat <- as.matrix(input[, grep("^Y", colnames(input))]) # 掩码替换:X为0的位置设为NA z_mat <- y_mat z_mat[x_mat == 0] <- NA # 转换为tibble并重命名列 output <- as_tibble(z_mat) %>% rename_with(~ paste0("Z", substr(.x, 2, nchar(.x))))
方法3:逐列手动定义(适合少量变量)
如果X-Y组数不多,可直接手动生成Z列:
output <- input %>% mutate(Z1 = ifelse(X1 == 1, Y1, NA), Z2 = ifelse(X2 == 1, Y2, NA), Z3 = ifelse(X3 == 1, Y3, NA)) %>% select(starts_with("Z"))
以上方法均可得到目标输出,方法1、2更适配变量数量较多的场景。
内容的提问来源于stack exchange,提问作者oriloc
相关产品推荐
相关产品推荐

