2014-10-09 27 views
2

我有幾個txt文件。每個文件都有由逗號分隔的數據列。並且每個都有自己的文件名。在數據框中插入文件名作爲列值

到目前爲止,我已經將這些文件合併成一個大的數據幀,使用下面的代碼:

files = list.files() 
data2=lapply(files, read.table, header=FALSE, sep=",") 
data_rbind <- do.call("rbind", data2) 
colnames(data_rbind)[c(1,2,3)]<-c("name", "sex", "amount") 

這將返回:

name sex amount

Anna F 24567

Emma F

Isabelle F 31212

Amanda F 22631

我想補充一個4列,指定下一個對每行數據,數據最初來源的文件的名稱。

因此,舉例來說,如果第一個文件 'example1.txt' 包含以下內容:

Anna, F, 24567

Emma, F,

Isabelle, F, 31212

第二個文件 'example2.txt' 包含以下內容:

Amanda, F, 22631

Sara, F, 41355

Katie, F, 2387

我想要得到以下內容:

Name Sex Amount Year

Anna F 24567 example1.txt

Emma Fexample1.txt

Amanda F 22631 example2.txt

Sara F 41355 example2.txt

Katie F 2387 example2.txt

這可能嗎?

回答

1

嘗試:

files = list.files() 
data2=lapply(files, read.table, header=FALSE, sep=",") 
for (i in 1:length(data2)){data2[[i]]<-cbind(data2[[i]],files[i])} 
data_rbind <- do.call("rbind", data2) 
colnames(data_rbind)[c(1,2,3,4)]<-c("name", "sex", "amount","year") 
+0

謝謝你完美的作品! – perriebtee 2014-10-09 08:43:33

0

你可以嘗試這樣的:

data2 = lapply(files, function(x) { 
    res <- read.table(x, header=FALSE, sep=",") 
    res$year <- x 
    res 
}, header=FALSE, sep=",") 

data_rbind <- do.call("rbind", data2) 
colnames(data_rbind) <- c("name", "sex", "amount", "year") 
+0

它工作得很好,直到最後一行代碼出現錯誤: 「C(1,2,3)< - c(」name「,」sex「,」amount「,」year「 ): 任務的目標擴展到非語言對象「 ? – perriebtee 2014-10-09 08:37:38

+0

是的,我只是複製這部分,並沒有檢查它,它現在應該工作。 – alko989 2014-10-09 08:40:00

2

您還可以使用:

nm1 <- c("Name", "Sex", "Amount", "Year") 
    files <- list.files(pattern="^example") 
    files 
    #[1] "example1.txt" "example2.txt" 

    setNames(do.call(rbind,Map(`cbind`, 
      lapply(files, read.table, sep=","), V4=files)), nm1) 

    #  Name Sex Amount   Year 
    #1  Anna F 24567 example1.txt 
    #2  Emma Fexample1.txt 
    #3 Isabelle F 31212 example1.txt 
    #4 Amanda F 22631 example2.txt 
    #5  Sara F 41355 example2.txt 
    #6 Katie F 2387 example2.txt 

或者使用rbindlistdata.table

library(data.table) 
setnames(rbindlist(Map(`cbind`,lapply(files, fread),files)),nm1)[] 
#  Name Sex Amount   Year 
#1:  Anna F 24567 example1.txt 
#2:  Emma Fexample1.txt 
#3: Isabelle F 31212 example1.txt 
#4: Amanda F 22631 example2.txt 
#5:  Sara F 41355 example2.txt 
#6: Katie F 2387 example2.txt 
相關問題