簡體   English   中英

R數據框列名稱重命名

[英]R Data Frames column names rename

我是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,然后在循環中填充行。

2)R有一個方便的函數paste0 ,不需要您指定sep = ""

3)無需在sum指定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)
}  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM