grep还是pmatch?

时间:2011-10-16 20:08:33

标签: r lookup

我正在尝试从目录导入一系列文件,并将每个文件转换为数据帧。我还想使用文件标题创建两个具有依赖于标题的值的新列。输入文件的格式为: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的查找。我正在玩弄任何一个工作,但欢迎任何建议。

2 个答案:

答案 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"