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

如何筛选R数据框中含*的单元格并提取*前字符串生成新数据框

R数据框处理:筛选含*的单元格并提取前缀

需求

  • 筛选数据框中所有包含*的单元格
  • 生成仅保留每个*前字符串的新数据框(注:若需保留原带*的内容,可调整处理逻辑)

测试数据

X1  <- data.frame(c("Tricho*", "Proteo", "Cyano*", "Gold", "Pseudo"))
X2 <- data.frame(c(" ", "alpha*", " ", "fish", "nitzs"))
X3 <- data.frame(c(" ", " ", " ", "bowl*", "ia"))
Data <- cbind(X1, X2, X3)

Data1 <- Data %>%
  rename("X1" = "c..Tricho.....Proteo....Cyano.....Gold....Pseudo..",
         "X2" = "c.......alpha..........fish....nitzs..",
         "X3" = "c.................bowl.....ia..")

期望输出

X4
Tricho*
alpha*
Cyano*
bowl*

尝试过的无效方法

方法1:转为字符后用endsWith

Data1 <- as.character(Data1)
out <- data.frame(Data1[endsWith(Data1, '*')])
View(out) 

问题:as.character(Data1)会将整个数据框转为字符向量,破坏单元格层级;部分带*的单元格前有空格,导致endsWith无法匹配,最终生成空白数据框。

方法2:用grep匹配结尾*

Data1 <- as.character(Data1)
out2 <- data.frame(grep('*$', Data1, value = TRUE))
View(out2)

问题:*是正则表达式特殊字符,未转义会导致匹配逻辑错误;同时转为字符后破坏原数据框结构,返回结果不符合需求。

解决方案

使用tidyverse工具链处理,兼顾效率与准确性,大文件也能稳定运行:

步骤1:筛选含*的单元格并整理成单列

library(tidyverse)

# 转长格式→筛选含*的行→整理为目标格式
result <- Data1 %>%
  pivot_longer(everything(), names_to = "col", values_to = "value") %>%
  filter(str_detect(value, "\\*")) %>%  # 转义*,匹配包含*的单元格
  select(X4 = value)  # 重命名为目标列名

运行后得到的result与期望输出一致:

# A tibble: 4 × 1
  X4      
  <chr>   
1 Tricho* 
2 alpha*  
3 Cyano*  
4 bowl*   

步骤2:提取*前的字符串(若需仅保留前缀)

如果需要生成仅包含*前字符串的新数据框,添加str_extract处理即可:

result_prefix <- Data1 %>%
  pivot_longer(everything(), names_to = "col", values_to = "value") %>%
  filter(str_detect(value, "\\*")) %>%
  mutate(X4 = str_extract(value, "^.*(?=\\*)")) %>%  # 提取*前的所有字符
  select(X4)

输出结果:

# A tibble: 4 × 1
  X4     
  <chr>  
1 Tricho 
2 alpha  
3 Cyano  
4 bowl   

说明

  • pivot_longer将宽格式数据转为长格式,实现对所有单元格的统一处理
  • str_detect用转义后的\\*匹配包含星号的单元格,避免正则表达式语法冲突
  • str_extract配合正向预查(?=\\*),精准提取*之前的字符,不包含星号本身
  • 该方法适配大文件场景,tidyverse系列函数在大数据处理中性能稳定

内容的提问来源于stack exchange,提问作者Clayton Tracey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 03:31:36