【问题标题】:R store the for loop output in vectorR将for循环输出存储在向量中
【发布时间】:2017-06-05 15:51:45
【问题描述】:

我是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

我意识到它只取 (case) 中的最后一个值。

我的问题是如何将(案例)输出存储到向量中 所以当我调用 data.frame 函数时,它会返回正确的输出。

谢谢

【问题讨论】:

    标签: r


    【解决方案1】:

    如果 id 是数字向量,这应该可以完成工作(未经测试,因为您没有提供可重复的示例!)

    否则,您应该在循环内使用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 )
    }
    

    【讨论】:

    • 谢谢,你能解释一下“NULL”是做什么的吗?
    • 它在你的工作空间中创建了一个对象cases,它实际上是空的。在 for 循环中,此对象“增长”为向量。我必须同意@Sven Hohenstein 的观点,这不是一个非常有效的解决方案,但是我想让代码与您的问题中的代码相似。
    【解决方案2】:

    这是一个更有效的任务功能:

    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)))))
    }
    

    【讨论】:

      【解决方案3】:
      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
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-18
        • 2020-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-03
        • 2017-06-11
        相关资源
        最近更新 更多