2016-04-15 34 views
0

我試圖創建一個for循環,爲每個類似於這個但有更多文件的4個csv文件做一些事情。R循環執行多個csv文件的功能

dat1<- read.csv("female.csv", header =T) 
dat2<- read.csv("male.csv", header =T) 

for (i in 1:2) { 
    message("Female, Male") 
    Temp <- dat[i][(dat[i]$NAME == "Temp"), ] 
    Temp <- Temp[complete.cases(Temp)] 
    print(mean(Temp$MEAN)) 

但是,我得到一個錯誤:

Error in Temp$MEAN : $ operator is invalid for atomic vectors

不知道爲什麼,這是行不通的。任何幫助將不勝感激循環通過CSV文件!

+1

您在for循環中關閉'}'在哪裏? – WillardSolutions

+1

'dat [1]'是'dat'的第一個元素。 'dat1'是另一個對象! – jogo

+0

可能讀多個文件的最好方法是把它們放在一個列表中。看到下面的鏈接爲例:http://stackoverflow.com/questions/19501040/using-read-csv-in-a-for-loop – lmo

回答

0

我個人認爲,要做到這一點最簡單的方法是用plyr包:

library(plyr) 
myFiles <- c("male.csv", "female.csv") 
dat <- ldply(myFiles, read.csv) 
dat <- dat[complete.cases(dat), ] 
mean(dat$MEAN) 

這種工作方式是先創建文件名的載體。然後,ldply()函數對文件名向量執行函數read.csv(),並將輸出自動轉換爲data.frame。然後以通常的方式完成complete.cases()和mean()。

編輯:

但是如果你想每個文件的平均那麼這裏就是這樣做的一種方式:

# create a vector of files 
myFiles <- c("male.csv", "female.csv") 

# create a function that properly handles ONLY ONE ELEMENT 
readAndCalc <- function(x){   # pass in the filename 
    tmp <- read.csv(x)     # read the single file 
    tmp <- tmp[complete.cases(tmp), ] # complete.cases() 
    mean(tmp$MEAN)      # mean 
} 

x <- "male.csv" 
readAndCalc(x)       # test with ONE file 

sapply(myFiles, readAndCalc)   # run with all your files 

這種工作方式是先創建文件名的向量,就像以前一樣。然後創建一次只能處理一個文件的函數。然後,您可以使用剛剛創建的readAndCalc函數測試該函數的工作原理。最後用sapply()函數爲你的所有文件做這件事。希望有所幫助。

+0

我可以看到,你是在R的初學者。我有相同的在學習R開始時也存在問題。這是正常的,直到你開始「在R方式思考」。別擔心。你很快就會明白。 – hackR

+0

謝謝,這有效,但它似乎結合了所有的文件。我想爲每個文件分別輸出。這就是爲什麼我想通過它們循環。 – user6210879