如何根据文件路径与文件名给数据框列赋值并解决条件长度报错
问题解决:为匹配的idat文件生成路径列
问题背景
需求:当数据框clin.info的File.Name列与idat文件夹中的idat文件名匹配时,新建Basename列,填充为path/idat/clin.info$File.Name格式的路径。
用户编写的R代码:
for(file in paste0(getwd(), "/idat/*.idat")){ if(file == clin.info$File.Name) { clin.info$Basename <- paste0(getwd(), "/idat/", clin.info$File.Name) } }
运行后报错:
Error in if (file == clin.info$File.Name) { : the condition has length > 1
报错原因
paste0(getwd(), "/idat/*.idat")仅生成带通配符的字符串,无法获取实际文件列表,不能用于遍历文件。file == clin.info$File.Name将单个字符串与整个列向量比较,得到长度大于1的逻辑向量,而if语句仅接受长度为1的条件,因此触发报错。
正确实现方法
基础R实现
# 获取idat文件夹下所有.idat格式的文件名(仅保留文件名,不含完整路径) idat_files <- list.files(path = "idat", pattern = "\\.idat$", full.names = FALSE) # 为匹配的行生成路径,不匹配的填充NA clin.info$Basename <- ifelse(clin.info$File.Name %in% idat_files, paste0(getwd(), "/idat/", clin.info$File.Name), NA_character_)
tidyverse风格实现(需加载dplyr包)
library(dplyr) idat_files <- list.files("idat", pattern = "\\.idat$", full.names = FALSE) clin.info <- clin.info %>% mutate(Basename = case_when( File.Name %in% idat_files ~ file.path(getwd(), "idat", File.Name), TRUE ~ NA_character_ ))
效果说明
list.files通过full.names = FALSE获取纯文件名,确保与clin.info$File.Name的内容直接匹配。- 采用向量式操作替代循环,既避免了循环的低效,也解决了原代码中条件长度不匹配的问题。
- 最终
Basename列仅为idat文件夹中存在对应文件的行生成完整路径,无匹配的行则填充NA。
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

