在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
相关产品推荐
相关产品推荐

