如何处理DataFrame多值变量,提取含指定向量值的对应字段?
解决方案
要处理多值分号分隔的匹配场景,我们可以通过自定义函数逐行筛选匹配vec1的元素,并同步保留对应位置的var2值。以下是具体实现:
步骤1:加载所需包
我们需要dplyr用于数据处理,stringr用于字符串拆分(也可以用基础R的strsplit):
library(dplyr) library(stringr)
步骤2:定义匹配筛选函数
这个函数会接收单行的var1、var2字符串,以及匹配向量vec1,返回筛选后的var1b和var2b:
filter_matching <- function(var1_str, var2_str, vec) { # 拆分分号分隔的字符串为向量 var1_parts <- strsplit(var1_str, ";")[[1]] var2_parts <- strsplit(var2_str, ";")[[1]] # 找出var1中属于vec的元素位置 match_pos <- var1_parts %in% vec # 无匹配元素时返回NA if (!any(match_pos)) { return(list(var1b = NA_character_, var2b = NA_character_)) } # 筛选并合并匹配的元素 var1b <- paste(var1_parts[match_pos], collapse = ";") var2b <- paste(var2_parts[match_pos], collapse = ";") return(list(var1b = var1b, var2b = var2b)) }
步骤3:应用函数处理数据
使用rowwise()逐行处理数据,调用自定义函数生成结果:
data_output <- data %>% rowwise() %>% mutate( temp_result = list(filter_matching(var1, var2, vec1)), var1b = temp_result$var1b, var2b = temp_result$var2b ) %>% select(-temp_result) %>% ungroup()
验证结果
运行后得到的data_output与你期望的结果一致:
> data_output # A tibble: 7 × 4 var1 var2 var1b var2b <chr> <chr> <chr> <chr> 1 jup 0 NA NA 2 far 8 NA NA 3 part 5 part 5 4 part;melt 7;8 part;melt 7;8 5 rat 3 NA NA 6 rat;art 9;4 art 4 7 kir;door;art 6;5;9 kir;door;art 6;5;9
替代方案(使用purrr)
如果习惯用purrr的映射函数,也可以这样实现:
library(purrr) data_output <- data %>% mutate( result = map2(var1, var2, ~filter_matching(.x, .y, vec1)), var1b = map_chr(result, ~.x$var1b), var2b = map_chr(result, ~.x$var2b) ) %>% select(-result)
内容的提问来源于stack exchange,提问作者Av65
相关产品推荐
相关产品推荐

