我正在尝试从目录导入一系列文件,并将每个文件转换为数据帧。我还想使用文件标题创建两个具有依赖于标题的值的新列。输入文件的格式为:xx_yy.out
其中XX目前可以是三个值中的一个。 YY目前有两个可能的值。将来这些数字会上升。
根据评论编辑解决方案(请参阅下面的原始问题)
再次编辑以反映@JoshO'Brien的建议
filelist <- as.list(dir(pattern = ".*.out"))
for(i in filelist) {
tempdata <- read.table(i) #read the table
filelistshort <- gsub(".out$", "", i) #remove the end of the file
tempsplit <- strsplit(filelistshort, "_") #remove the underscore
xx <- sapply(tempsplit, "[", 1) #get xx
yy <- sapply(tempsplit, "[", 2) #get yy
tempdata$XX <- xx #add XX column
tempdata$YY <- yy #add YY column
assign(gsub(".out","",i), tempdata) # give the dataframe a shortened name
}
以下是原始代码,显示我想使用某些方法来确定XX和YY值,但不确定最佳方式:
我的大纲(在@romanlustrik post之后)如下:
filelist <- as.list(dir(pattern = ".*.out"))
lapply(filelist, FUN = function(x) {
xx <- grep() or pmatch()
yy <- grep() or pmatch()
x <- data.frame(read.table(x))
x$colx <- xx
x$coly <- yy
return(x)
})
其中xx <-
和yy <-
行是基于pmatch或grep的查找。我正在玩弄任何一个工作,但欢迎任何建议。
答案 0 :(得分:2)
如果我们假设您的文件名只包含一个"_"
,我就不会使用grep()
或pmatch()
。
strsplit()
似乎提供了更简洁的解决方案:
filelist <- c("aa_mm.out", "bb_mm.out", "cc_nn.out")
# Remove the trailing ".out"
rootNames <- gsub(".out$", "", filelist)
# Split string at the "_"
rootParts <- strsplit(rootNames, "_")
# Extract the first and second parts into character vectors
xx <- sapply(rootParts, "[", 1)
yy <- sapply(rootParts, "[", 2)
xx
# [1] "aa" "bb" "cc"
yy
# [1] "mm" "mm" "nn"
答案 1 :(得分:0)
这是一个丑陋的黑客,但完成工作。
fl <- c("12_34.out", "ab_23.out", "02_rk.out")
xx <- regexpr(pattern = ".._", text = fl)
XX <- (substr(fl, start = xx, stop = xx + attr(xx, "match.length")-1))
[1] "12" "ab" "02"
yy <- regexpr(pattern = "_..", text = fl)
YY <- (substr(fl, start = yy + 1, stop = yy + attr(yy, "match.length")-1))
[1] "34" "23" "rk"