2014-01-17 51 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 
}