如何在R中提取含Y的列名并合并为新列?
在R中实现指定列名拼接需求
问题说明
现有R数据框DATA,需要新增一列New_Column:将A至F列中值为Y的列名以下划线连接;若所有列值都是N,则填N;若所有列值都是NA,则填NA,最终效果如Desired_Output所示。
数据示例:
DATA <- read.table(header=TRUE, text=" ID A B C D E F 1 Y Y N N N N 2 N N N Y N N 3 Y N Y N Y N 4 Y Y N N N N 5 N N N Y N N 6 Y Y Y N N N 7 N N N N N N 8 NA NA NA NA NA NA") Desired_Output <- read.table(header=TRUE, text=" ID A B C D E F New_Column 1 Y Y N N N N A_B 2 N N N Y N N D 3 Y N Y N Y N A_C_E 4 Y Y N N N N A_B 5 N N N Y N N D 6 Y Y Y N N N A_B_C 7 N N N N N N N 8 NA NA NA NA NA NA NA")
实现方案
该需求完全可以在R中实现,以下提供两种常用方法:
方法一:Base R 原生实现
通过apply逐行遍历,结合逻辑判断完成拼接:
# 获取A到F列的列名 target_cols <- names(DATA)[-1] # 生成New_Column列 DATA$New_Column <- apply(DATA[, target_cols], 1, function(row_vals) { # 筛选当前行值为Y的列名 matched_cols <- target_cols[row_vals == "Y"] # 根据不同情况返回结果 if (all(is.na(row_vals))) { NA_character_ } else if (length(matched_cols) == 0) { "N" } else { paste(matched_cols, collapse = "_") } })
方法二:Tidyverse 工具包实现
使用dplyr的行处理功能,代码更简洁易读:
library(dplyr) DATA <- DATA %>% rowwise() %>% mutate( # 收集当前行值为Y的列名 matched_cols = list(names(select(., A:F))[c_across(A:F) == "Y"]), # 生成最终列值 New_Column = case_when( all(is.na(c_across(A:F))) ~ NA_character_, length(matched_cols) == 0 ~ "N", TRUE ~ paste(matched_cols, collapse = "_") ) ) %>% ungroup() %>% select(-matched_cols) # 移除临时辅助列
运行上述任意一种方法后,DATA的结构和内容将与Desired_Output完全一致。
内容的提问来源于stack exchange,提问作者Simon Harmel
相关产品推荐
相关产品推荐

