You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 04:10:28