使用dplyr根据两字符列的差异生成新列的实现方法
使用dplyr根据两字符列的差异生成新列的实现方法
我来帮你搞定这个需求~你想要从char_2列里提取出那些不在char_1列中出现的元素,最后用|拼接成新的dif_char列,用dplyr配合字符串处理函数就能轻松实现,下面是完整的可运行代码和步骤解释:
首先先定义你的原始数据:
library(dplyr) library(stringr) # 依赖这个包处理字符串分割和拼接 raw_data <- data.frame( cat = c("a"), char_1 = c("1kg|2kg"), char_2 = c("0kg|1kg|8kg") )
接下来是核心的处理代码:
wished_df <- raw_data %>% rowwise() %>% # 必须按行处理,保证每一行的字符串独立计算 mutate( # 将两个字符串按|分割成字符向量 vec1 = str_split(char_1, "\\|")[[1]], vec2 = str_split(char_2, "\\|")[[1]], # 计算vec2相对于vec1的差集,再拼接回|分隔的字符串 dif_char = str_c(setdiff(vec2, vec1), collapse = "|") ) %>% ungroup() %>% # 取消行分组,恢复数据框默认的列处理模式 select(-vec1, -vec2) # 移除临时生成的中间列 # 查看结果 wished_df
运行后你会得到目标的结果:
cat char_1 char_2 dif_char 1 a 1kg|2kg 0kg|1kg|8kg 0kg|8kg
我再拆解下关键步骤:
rowwise():这一步很重要,因为我们需要对每一行的char_1和char_2分别处理,而不是把整个列的所有字符串混在一起计算str_split(..., "\\|"):把用|分隔的字符串拆成字符向量,注意|是正则表达式里的特殊字符,所以要加两个反斜杠转义setdiff(vec2, vec1):直接求差集,自动筛选出char_2有但char_1没有的元素str_c(..., collapse = "|"):把差集的元素重新拼接回你需要的|分隔格式
如果你的数据有多行记录,这个方法也完全适用,rowwise()会自动逐行处理每一行的字符串对。
内容来源于stack exchange
相关产品推荐
相关产品推荐

