R数据帧列名重命名

R数据帧列名重命名,r,R,我是R新手,不知道为什么我必须在程序末尾重命名数据框列名,尽管我已经在程序开头用列名定义了数据框。数据框的用途是,我得到了两列,其中我必须在ID列下保存序列,在NOBS列中保存某种数字 complete <- function(directory, id = 1:332) { collectCounts = data.frame(id=numeric(), nobs=numeric()) for(i in id) { fileName = sprintf("%03d

我是R新手,不知道为什么我必须在程序末尾重命名数据框列名,尽管我已经在程序开头用列名定义了数据框。数据框的用途是,我得到了两列,其中我必须在ID列下保存序列,在NOBS列中保存某种数字

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

  collectCounts = data.frame(id=numeric(), nobs=numeric()) 

  for(i in id)  {
    fileName = sprintf("%03d",i)
    fileLocation = paste(directory, "/", fileName,".csv", sep="")

    fileData = read.csv(fileLocation, header=TRUE)
    completeCount = sum(!is.na(fileData[,2]), na.rm=TRUE)

    collectCounts <- rbind(collectCounts, c(id=i, completeCount))
    #print(completeCount)

  }

  colnames(collectCounts)[1] <- "id"
  colnames(collectCounts)[2] <- "nobs"  
  print(collectCounts)  

}

您的具体问题不太清楚,因为您没有提供详细的解决方案。不过,我可以给出一些改进代码的建议

1不建议在循环中“增长”data.frame。这在R中效率极低,因为它每次都复制整个结构。最好是在开始时分配整个data.frame,然后填充循环中的行

2R有一个方便的函数Paste0,它不需要您指定sep=

3没有必要在求和中指定na.rm=TRUE,因为is.na永远不会返回na的值

综合起来:

complete = function(directory, id = 1:332) {
  collectCounts = data.frame(id=id, nobs=numeric(length(id))) 
  for(i in 1:length(id))  {
    fileName = sprintf("%03d", id[i])
    fileLocation = paste0(directory, "/", fileName,".csv")
    fileData = read.csv(fileLocation, header=TRUE)
    completeCount = sum(!is.na(fileData[, 2]))
    collectCounts[i, 'nobs'] <- completeCount
  }
}

如果没有示例数据,总是很难回答问题

你可以从

collectCounts = data.frame(id, nobs=NA)
在您的循环中,执行以下操作:

collectCounts[i, 2] <- completeCount
以下是另一种方法:

complete <- function(directory, id = 1:332) {
    nobs <- sapply(id, function(i) {
            fileName = paste0(sprintf("%03d",i), ".csv")
            fileLocation = file.path(directory, fileName)
            fileData = read.csv(fileLocation, header=TRUE)
            sum(!is.na(fileData[,2]), na.rm=TRUE)
        }
    )
    data.frame(id=id, nobs=nobs)
}  

你写这段代码的目的是什么?谢谢你的评论,有了你宝贵的反馈,我能更好地理解它。