2013-03-21 168 views
3

這是一個較大的腳本的一部分 - 長篇故事的簡短部分,輸入到R是分號分隔的路徑,以指向我的文本文件的位置。所有文本文件格式如下:在for循環中添加列R

文件1:

Name1 3 
Name2 4 
Name3 55 

文件2:

Name1 4 
Name2 33 
Name3 102 

文件3:

Name1 12 
Name2 2 
Name5 33 

下面是一個例子:

cond1<-'/User/Desktop/File1;/User/Desktop/File2;/User/Desktop/File3' 

#separates the elements 
normalList<-strsplit(cond1, ";") 

#now you can access each element 
nor<-unlist(normalList) 

baseNorm<-vector("list", length(nor)) 
dirNorm<-vector("list", length(nor)) 
pathNorm<-vector("list", length(nor)) 
Norm<-vector("list", length(nor)) 
new<-vector("list", length(nor)) 
for (i in 1:length(nor)) 
{ 
    baseNorm[[i]] <- basename(nor[i]) 
    dirNorm[[i]]<-dirname(nor[i]) 
    pathNorm[[i]]<-paste(dirNorm[[i]], baseNorm[[i]], sep="/") 
    Norm[[i]]<-read.delim(pathNorm[[i]], header=F) 

} 

在這裏的示例中,對R的輸入包含3個文件,但是我需要足夠靈活的腳本,以便可以傳遞任意數量的文件,因此可以使用for循環。大的想法是: 1)獲取所有文件的特定文件的路徑。 2)將文本文件加載到R 3)創建一個包含公共第一列(Name1,Name2,Name3)的新文件。在所有新文件中的下一列對應於文件1,文件2,文件3,FILE4等的第2列 從本質上講,我需要創建一個主文件:

Name1 3 4 55 
Name2 4 33 102 
Name3 12 2 33 

我相信有一個更簡單解決方案,甚至到我已經擁有的代碼,因爲所有的[[]]我都不知道如何開始編寫一個創建主文件的函數。我剛開始使用R,所以任何輸入都是有價值的學習體驗,並且預先感謝您!

+0

'list.files'(參見參數模式),'lapply'和'do.call'是關鍵字。 – 2013-03-21 23:18:22

回答

3

這樣的事情? :

fileNames <- list.files() 

master1 <- read.csv(file = fileNames[1], sep = ";", header = T)  

for(i in 2:length(fileNames)){  
file1 <- read.csv(file = fileNames[i], sep = ";", header = T) 
master1$newCol1 <- file1[,2] 
colnames(master1)[ncol(master1)] <- paste("file",i,sep = "") 
} 
+1

爲什麼不使用'[[''而不是'''',那麼你不必使用'colnames'-' – mnel 2013-03-21 23:39:54

+0

'我不熟悉'[['。它有什麼作用? – screechOwl 2013-03-22 00:08:11

+0

請參閱'?「[['''和'library(fortune); fortune(312)' – mnel 2013-03-22 00:12:08

1

我意識到我可能有點含糊。以下是一些可能有所幫助的半僞代碼。

my.files <- list.files(pattern = ".csv") 
imported.files <- sapply(my.files, read.csv, ...) # additional paramaters for proper import 
out <- do.call("cbind", imported.files)