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

在R语言中满足条件时生成含对应字母的新列的方法

在R语言中根据条件匹配参考表生成新列

需求说明

我们需要在数据框df中创建名为New的新列,规则是:每行中值为1的列,对应参考表reftab里关联的字母,最终将这些字母拼接成字符串作为New列的值。

示例数据

df <- data.frame(c(1,0,1), c(0,0,1), c(0,1,1), c(1,1,0), c(1,0,0))
names(df) <- paste0("C",1:5)

reftab <- data.frame(col1 = paste0("C",1:5), 
                     col2 = LETTERS[1:5])

解决方案

方法1:Base R 实现

无需额外加载包,直接用基础函数完成:

# 生成New列
df$New <- apply(df, 1, function(row) {
  # 获取当前行值为1的列名
  target_cols <- names(row)[row == 1]
  # 匹配参考表中的对应字母
  target_letters <- reftab$col2[match(target_cols, reftab$col1)]
  # 将字母拼接为字符串(用逗号分隔)
  paste(target_letters, collapse = ", ")
})

# 查看最终结果
print(df)

运行结果:

C1 C2 C3 C4 C5    New
1  1  0  0  1  1 A, D, E
2  0  0  1  1  0    C, D
3  1  1  1  0  0 A, B, C

方法2:tidyverse 工具包实现

适合习惯管道式操作的场景,需先加载dplyr和tidyr:

library(dplyr)
library(tidyr)

df_new <- df %>%
  # 添加行号用于后续分组合并
  mutate(row_id = row_number()) %>%
  # 宽表转长表,方便筛选匹配
  pivot_longer(cols = -row_id, names_to = "col1", values_to = "value") %>%
  # 只保留值为1的记录
  filter(value == 1) %>%
  # 关联参考表获取对应字母
  left_join(reftab, by = "col1") %>%
  # 按行号分组,拼接字母
  group_by(row_id) %>%
  summarise(New = paste(col2, collapse = ", "), .groups = "drop") %>%
  # 合并回原数据框
  right_join(df %>% mutate(row_id = row_number()), by = "row_id") %>%
  # 调整列顺序并移除行号
  select(New, everything(), -row_id)

# 查看结果
print(df_new)

方法3:data.table 实现(大数据场景高效)

如果处理的数据集规模较大,data.table的处理速度更有优势:

library(data.table)

# 转换为data.table格式
setDT(df)
setDT(reftab)

# 添加行号
df[, row_id := .I]

# 处理流程
df_new <- melt(df, id.vars = "row_id", variable.name = "col1") %>%
  .[value == 1] %>%
  merge(reftab, by = "col1") %>%
  .[, .(New = paste(col2, collapse = ", ")), by = row_id] %>%
  merge(df, by = "row_id") %>%
  .[, row_id := NULL] %>%
  # 调整列顺序,把New列放在最前面
  setcolorder(c("New", paste0("C", 1:5)))

# 查看结果
print(df_new)

内容的提问来源于stack exchange,提问作者ltong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 17:07:41