R语言中基于条件的字符串拼接实现方法问询
R语言按条件拼接列内容的实现方案
问题背景
现有如下R数据集:
id = 1:5 col1 = c("12 ABC", "123", "AB", "123344567", "1345677.") col2 = c("gggw", "12", "567", "abc 123", "p") col3 = c("abw", "abi", "klo", "poy", "17df") col4 = c("13 AB", "344", "Huh8", "98", "b") my_data = data.frame(id, col1, col2, col3, col4)
数据集结构:
id col1 col2 col3 col4 1 1 12 ABC gggw abw 13 AB 2 2 123 12 abi 344 3 3 AB 567 klo Huh8 4 4 123344567 abc 123 poy 98 5 5 1345677. p 17df b
通过以下代码检查各单元格是否包含至少一个数字:
my_data$col1_check = grepl("\\d", my_data$col1) my_data$col2_check = grepl("\\d", my_data$col2) my_data$col3_check = grepl("\\d", my_data$col3) my_data$col4_check = grepl("\\d", my_data$col4)
得到带检查标记的数据集:
id col1 col2 col3 col4 col1_check col2_check col3_check col4_check 1 1 12 ABC gggw abw 13 AB TRUE FALSE FALSE TRUE 2 2 123 12 abi 344 TRUE TRUE FALSE TRUE 3 3 AB 567 klo Huh8 FALSE TRUE FALSE TRUE 4 4 123344567 abc 123 poy 98 TRUE TRUE FALSE TRUE 5 5 1345677. p 17df b TRUE FALSE TRUE FALSE
需求:对每一行,将所有检查结果为FALSE的对应列(col1-col4)的内容用空格拼接成单个单元格,预期输出:
id new_col 1 1 gggw abw 2 2 abi 3 3 AB klo 4 4 poy 5 5 p b
解决方案
方法一:Base R实现
利用apply逐行处理,根据检查列的布尔值筛选对应原始列内容后拼接:
# 定义原始列和对应的检查列名称 orig_cols = c("col1", "col2", "col3", "col4") check_cols = paste0(orig_cols, "_check") # 逐行生成拼接结果 my_data$new_col = apply(my_data, 1, function(row) { # 筛选当前行中检查为FALSE的原始列内容 selected_content = row[orig_cols][!as.logical(row[check_cols])] # 用空格拼接内容,空值自动忽略 paste(selected_content, collapse = " ") }) # 提取最终结果 final_result = my_data[, c("id", "new_col")] print(final_result)
方法二:Tidyverse框架实现
结合dplyr和purrr的行处理能力,更贴合tidy风格:
library(dplyr) library(purrr) final_result = my_data %>% rowwise() %>% mutate( new_col = paste( # 获取当前行col1-col4的所有值 c_across(col1:col4)[ # 用检查列的布尔值筛选需要保留的内容 !c(col1_check, col2_check, col3_check, col4_check) ], collapse = " " ) ) %>% ungroup() %>% select(id, new_col) print(final_result)
两种方法都能输出符合预期的结果,可根据个人代码习惯选择使用。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

