如何从R中的basename结尾删除文件扩展名?

时间:2017-07-12 03:34:40

标签: r regex csv filepath gsub

如何列出文件夹中的数据文件并将其文件名存储在数据框中而不将其扩展名作为因素?换句话说:如何从文件名列表中创建一个字符向量,省略' .csv'在从这些文件创建数据帧后,将此向量扩展并存储为数据框中的因子列表?

我的最终目标是将包含我的数据的文件名作为StudyID存储为数据框中的因子。我认为这是一个非常简单的任务,但我没有发现正则表达式所需的格式,或者sapply和gsub之间存在一些改变格式的交互。

两个文件夹'计划'并且'模糊'每个文件都包含名为1.csv,2.csv等的文件,有时还包含非序列号。具体来说,我认为获得因素是很好的"模糊1","计划1","模糊2","计划2&# 34;等以命名从这些文件导入的数据,以引用研究ID(编号)和类别(计划或模糊)。

我在RStudio 1.0.143中尝试过的代码,对发生的事情发表评论:

# Create a vector of the files to process
filenames <- list.files(path = '../Desktop/data/',full.names=TRUE,recursive=TRUE) 
# We parse the path to find the terminating filename which contains the StudyID.
FileEndings <- basename(filenames)
# We store this filename as the StudyID
regmatches('.csv',FileEndings,invert=TRUE) -> StudyID   # Error: ‘x’ and ‘m’ must have the same length
lapply(FileEndings,grep('.csv',invert=TRUE)) -> StudyID # Error: argument "x" is missing, with no default
sapply(FileEndings,grep,'.csv',invert=TRUE) -> StudyID; StudyID # Wrong: Gives named integer vector of 1's
sapply(FileEndings,grep,'.csv',invert=TRUE,USE.NAMES=FALSE) -> StudyID; StudyID # Wrong: Gives integer vector of 1's
sapply(FileEndings,gsub,'.csv',ignore.case=TRUE,invert=TRUE,USE.NAMES=FALSE) -> StudyID; StudyID # Error: unused argument (invert = TRUE)
sapply(FileEndings,gsub,'.csv','',ignore.case=TRUE,USE.NAMES=FALSE) -> StudyID; StudyID # Wrong: vector of ""
sapply(FileEndings,gsub,'[:alnum:].csv','[:alnum:]',ignore.case=TRUE,USE.NAMES=FALSE) -> StudyID; StudyID # Wrong: vector of "[:alnum:]"
sapply(FileEndings,gsub,'[[:alnum:]].csv','[[:alnum:]]',ignore.case=TRUE,USE.NAMES=FALSE) -> StudyID; StudyID # Wrong: vector of "[[:alnum:]]"
sapply(FileEndings,gsub,'[:alnum:]\.csv','[:alnum:]',ignore.case=TRUE,USE.NAMES=FALSE) -> StudyID; StudyID # Error: '\.' is an unrecognized escape

该文档尚未回答这个问题,并且多个在线网页提供了过于简单的示例,但未解决此问题。我会继续搜索,但我希望您能提供解决方案来加快这项工作并帮助未来的用户。谢谢。

3 个答案:

答案 0 :(得分:3)

工具包中有一个内置函数:file_path_sans_ext

答案 1 :(得分:0)

如果您打算使用basename,也可以省略full.names的{​​{1}}参数(因为list.files为defualt)。 我对您的问题并不完全清楚,但以下代码是否有帮助?

FALSE

答案 2 :(得分:0)

我认为您错过了正则表达式中的$来专门替换文件结尾。

怎么样?
gsub(filenames, pattern=".csv$", replacement="")

这应截断文件的结尾。

如果你想摆脱这条道路,那么你可以对路径进行类似的替换:

gsub(filenames, pattern="^.*AAPM2017//", replacement="")