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

在R中多列筛选含.ect后缀数据并新增列的优化方法

解决方案

可以用tidyverse工具集里的pivot_longer将多列文件名数据转为长格式,一次性完成筛选与前缀提取,避免重复三次操作:

library(tidyverse)

data <- data.frame(
  "grammer" = c("Python","C","Java","GO",NA,"SQL"),
  "score" = c(1,2,NA,4,7,10),
  "file" = c("GHG.txt", "GXG.ect", NA , "VAC.ect", "GBA.ect", "GHG.txt"),
  "file2" = c("GHG.txt", "GXG.dat", "AGG.ect", "VAC.txt", "GBA.dat", "GHG.dat"),
  "file3" = c("GHG.dat", "GXG.txt", "AGG.dat", "VAC.dat", "GBA.txt", NA )
)

# 统一处理逻辑
result <- data %>%
  # 将file、file2、file3列转为长格式,保留其他原始字段
  pivot_longer(cols = starts_with("file"), names_to = "source_col", values_to = "filename") %>%
  # 精准筛选后缀为.ect的记录(匹配结尾更严谨)
  filter(str_ends(filename, ".ect")) %>%
  # 提取文件名前缀,移除第一个.及之后的所有内容
  mutate(prefix = str_remove(filename, "\\..*")) %>%
  # 按需保留字段,可根据需求调整
  select(grammer, score, source_col, filename, prefix)

print(result)

代码说明

  • pivot_longer:把分散的file列合并成单列,让筛选和转换逻辑只需要写一次,无需重复三次操作。
  • str_ends(filename, ".ect"):精准匹配文件名结尾是.ect的记录,比str_detect更严谨,不会误匹配到包含ect但后缀不符的文件(比如testect.txt)。
  • str_remove(filename, "\\..*"):和你原代码的sub("\\..*", "", file)效果一致,都是提取.之前的文件名前缀。

输出结果

运行后会得到所有符合条件的记录,包含原始数据字段、文件名来源列、原文件名和提取的前缀:

# A tibble: 4 × 5
  grammer score source_col filename prefix
  <chr>   <dbl> <chr>      <chr>    <chr> 
1 C           2 file       GXG.ect  GXG   
2 GO          4 file       VAC.ect  VAC   
3 NA          7 file       GBA.ect  GBA   
4 Java       NA file2      AGG.ect  AGG   

如果只需要提取的前缀列表,可再加一步:

prefix_list <- result %>% pull(prefix)
print(prefix_list)
# [1] "GXG" "VAC" "GBA" "AGG"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:09:24