2011-10-16 59 views
1

我想從目錄中導入一系列文件並將它們中的每一個轉換爲數據框。我還想使用文件標題創建兩個具有標題相關值的新列。輸入文件的格式爲:xx_yy.out 其中XX目前可以是三個值之一。 YY目前有兩個可能的值。將來這些數字會上升。根據該意見解決方案的grep或pmatch?


編輯(見下文原來的問題)


再次編輯,以反映的@ 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

如果我們可以假設你的文件名稱將只包含一個"_",我不會用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" 
+0

感謝約什。我在上面使用了你的解決方案,它的效果很好 – zach

+0

@zach - 沒問題。爲了緊湊和可靠,您可能希望將所有計算放在一個for()循環中或調用lapply()。如果你使用'lapply()'路由,你需要通過指定'assign(「objectName」,object,envir = .GlobalEnv)''確保賦值進入全局環境。 –

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"