2016-11-28 126 views
1

我有一個關於爲列表中每個元素添加新列的問題,這些列將包含這些文件的修改名稱。到目前爲止,我可以用substr來創建文件名列,但另一方面,我無法將新字符串添加到此列,例如「最佳」或「最差」字。修改文件列表中的文件名並將它們添加爲新列

這裏是我的重現性的嘗試,

這部分只生產文件.TXT工作目錄!

writeFiles <- function(n, maxRows=10){ 
    lapply(seq(10,90,10),function(x) write.table(sample(sample(maxRows)[1],replace=F),paste(x,'.txt',sep=""), quote=FALSE, col.names = FALSE,row.names=FALSE)) 
}  
writeFiles(9,10) 

filesToProcess <- dir(pattern = "*\\.txt") 

"10.txt" "20.txt" "30.txt" "40.txt" "50.txt" "60.txt" "70.txt" "80.txt" "90.txt" 

在接下來的步驟我會讀這個文件,修改文件名,列只需要.txt文件的第一個字符。

data.list <- lapply(filesToProcess,function(x){ 
    tmp <- read.table(file=x, header = F,fill=T, comment.char='*') 
# tmp$filenames <- paste0(substr(x,1,1),c("best","worst"),sep="") 
    tmp$filenames <- substr(x,1,1) 

    return(tmp) 
}) 

    data.list 
     [[1]] 
      V1 filenames 
     1 4   1 
     2 3   1 
     3 7   1 
     4 8   1 
     5 1   1 
     6 2   1 
     7 6   1 
     8 5   1 

     [[2]] 
      V1 filenames 
     1 4   2 
     2 1   2 
     3 5   2 
     4 3   2 
     5 2   2 
     6 6   2 
     7 7   2 

     [[3]] 
      V1 filenames 
     1 1   3 
     2 3   3 
     3 2   3 

事實上,我也希望新的字符串來filenames列,我試過的lapply內部粘貼命令,

data.list <- lapply(filesToProcess,function(x){ 
    tmp <- read.table(file=x, header = F,fill=T, comment.char='*') 
    tmp$filenames <- paste0(rep(c("best","worst"),c(4,5)),substr(x,1,1),sep="") 
    return(tmp) 
}) 

錯誤$<-.data.frame*tmp*, 「文件名」 ,value = c(「best1」,#「best1」,:替換有9行,數據有8個

所以前4個.tx t文件被標記爲最佳,其餘5個文件是最差的.txt文件。

怎麼能在lapply裏面做到這一點?

回答

2

我們可以將'data.list'的前四個元素子集,循環遍歷它們,然後transform'文件名'列。

data.list[1:4] <- lapply(data.list[1:4], transform, filenames= paste0("best", filenames)) 

類似的,同樣可以用剩下的5個list元素做

data.list[5:9] <- lapply(data.list[5:9], transform, filenames= paste0("worst", filenames)) 

我們也可以通過創建的 '最好' 的一個vector做到這一點從 'filesToProcess',「最糟糕的'然後遍歷'filesToProcess'序列

v1 <- rep(c("best", "worst"), c(4, 5)) 
lapply(seq_along(filesToProcess),function(i){ 
    tmp <- read.table(file=filesToProcess[i], header = FALSE, fill=TRUE, comment.char='*') 
    tmp$filenames <- paste0(v1[i], substr(filesToProcess[i],1,1), sep="") 
    tmp 
    }) 
+0

感謝Akrun。我們可以做到這一點,而不會脫離循環?像我建議的那樣。 – Alexander

+1

@Alexander我修改了代碼,請檢查一下是否有效 – akrun

+1

Hi Akrun。謝啦。和往常一樣完美:) – Alexander

相關問題