You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:26:45