在R中从多列提取含%的内容创建新变量composition
没问题,我来帮你解决这个提取成分信息的问题!你的需求是从每行的任意列中找出包含%的字符串,生成一个新的composition列对吧?我们一步一步来处理。
首先先确认你的数据框结构,运行你提供的代码后,eg是一个3行3列的数据框,每行对应一组产品属性:
C1 <- c("made in Italy", "100% silk", "dry clean only") C2 <- c("80% cotton, 20% polyester","made in France", "hand wash") C3 <- c("made in Italy", "Designer color : vanilla", " 100% nylon") eg <- as.data.frame(rbind(C1,C2,C3))
接下来分析你之前尝试的问题:
- 你写的
fcompo函数逻辑有问题:函数里直接修改全局的eg$composition会导致赋值混乱,而且grepl('%',x) = TRUE是语法错误(应该用==),同时函数没有返回值,自然无法正确生成列。 str_extract的问题:它是针对向量操作的,但你传入的是整个数据框的列子集,没有按行处理,所以无法正确提取每行的目标内容。
下面给你两种简单易懂的解决方案,分别用base R和tidyverse工具包:
方法1:用base R的apply逐行处理
这是不需要额外安装包的方法,适合新手快速上手:
# 给每行添加composition列 eg$composition <- apply(eg, 1, function(row) { # 筛选当前行中包含%的元素 matched <- grep("%", row, value = TRUE) # 如果有匹配项就用空格连接,没有就返回NA if (length(matched) > 0) { paste(matched, collapse = " ") } else { NA_character_ } })
运行后你会得到想要的结果:
> eg V1 V2 V3 composition C1 made in Italy 100% silk dry clean only 100% silk C2 80% cotton, 20% polyester made in France hand wash 80% cotton, 20% polyester C3 made in Italy Designer color : vanilla 100% nylon 100% nylon
方法2:用tidyverse工具包(更直观的管道写法)
如果你习惯用dplyr这类工具包,这种写法可读性更强:
首先确保安装并加载包:
install.packages("dplyr") install.packages("stringr") library(dplyr) library(stringr)
然后处理数据:
eg <- eg %>% rowwise() %>% # 让代码按行处理 mutate( composition = { # 获取当前行所有列的内容,筛选带%的元素 compo_items <- c_across(V1:V3)[str_detect(c_across(V1:V3), "%")] # 处理无匹配的情况 if (length(compo_items) > 0) { paste(compo_items, collapse = " ") } else { NA_character_ } } ) %>% ungroup() # 取消按行处理的状态
这个方法和base R的效果完全一致,只是写法更贴近自然语言。
额外小提示:如果某一行有多个列都包含%(比如一行里V1是"50% wool",V2是"50% cashmere"),上面的代码会自动把它们用空格连接起来,生成类似"50% wool 50% cashmere"的结果,完全满足需求~
内容的提问来源于stack exchange,提问作者Mouloune van Muzha
相关产品推荐
相关产品推荐

