在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
相关产品推荐
相关产品推荐

