2014-01-17 81 views
0

環路輸出我[R初學者,下面是我的代碼:[R存儲在矢量

complete <- function(directory, id = 1:332) { 


# Read through all the csv data file 
for (i in id) { 
    i <- sprintf("%03d", as.numeric(i)) 
    data <- read.csv(paste(directory, "/", i, ".csv", sep ="")) 
    good <- complete.cases(data) # Eliminating the NA rows 
    cases <- sum(good == TRUE) # add complete value  
} 


data.frame(id = id, nobs = cases) 
} 

當我打印輸出

id nobs 
1 1 402 
2 2 402 
3 3 402 
4 4 402 
5 5 402   (incorrect) 

,如果我只是打印情況

[1] 117 
[1] 1041 
[1] 243 
[1] 474 
[1] 402 

所以正確的輸出應該是

id nobs 
1 1 117 
2 2 1041 
3 3 243 
4 4 474 
5 5 402 

我意識到它只從(案例)中取得最後的價值。

我的問題是如何將(情況)輸出存儲到向量 ,所以當我調用data.frame函數時,它將返回正確的輸出。

感謝

回答

1

這應該做的工作,如果ID是一個數字矢量(未經檢驗的,因爲你沒有提供reprodicible例子!)

否則應該使用for(i in seq_along(id))id[i]內循環。

complete <- function(directory, id = 1:332) { 

cases <- NULL 
# Read through all the csv data file 
for (i in id) { 
    i <- sprintf("%03d", as.numeric(i)) 
    data <- read.csv(paste(directory, "/", i, ".csv", sep ="")) 
    good <- complete.cases(data) # Eliminating the NA rows 
    cases[i] <- sum(good == TRUE) # add complete value  
} 


data.frame(id = id, nobs = cases) 
} 
+0

謝謝,你能解釋一下 「NULL」 嗎? – user1804925

+0

它會在您的工作區中創建一個對象「cases」,它實際上是空的。在for循環中,這個對象'增長'到一個向量。我必須同意@Sven Hohenstein,這不是一個非常有效的解決方案,但是我想保留與你的問題相似的代碼。 – EDi

1

這是任務更有效的功能:

complete <- function(directory, id = 1:332) { 
    filenames <- file.path(directory, paste0(sprintf("%03d", id), ".csv")) 
    data.frame(id = id, 
      nobs = sapply(filenames, function(x) 
             sum(complete.cases(read.csv(x))))) 
} 
0
complete <- function(directory ,id = 1:332){ 
    folder = directory 
    df_total = data.frame() 
    for (x in id){ 
    filenames <- sprintf("%03d.csv", x) 
    filenames <- paste(folder,filenames,sep="\\") 
    df <- do.call(rbind,lapply(filenames,read.csv, header=TRUE)) 
    my_vector <- sum(complete.cases(enter the column for which you want)) 
    df1 <- data.frame(id=x,nobs=my_vector) 
    df_total <- rbind(df_total,df1) 
    } 
    df_total 
}