【问题标题】:Unknown NAs and sapply vs rbind未知的 NA 和 sapply vs rbind
【发布时间】:2022-01-25 12:12:40
【问题描述】:

查询:我为我的问题生成了工作代码,但我只是强行解决了问题,并想了解更多关于我在此过程中遇到的“错误”的信息。

我正在尝试做的事情: 编写一个函数,读取一个满是 csvs 的目录,并报告每个数据文件中完全观察到的案例数量,并将其呈现为 dataframe

问题 1:随机 NA

#part 2
complete<-function(id=1:332){
  #(1)read the files
  file_names<-list.files(path = "specdata/",pattern = ".csv",full.names = TRUE)
  a<-matrix(nrow=length(id),ncol=1)
  colnames(a)<-"nobs"
  
  #returning the data frame
  for(i in id){
    a<-rbind(a,sum(complete.cases(read.csv(file_names[i]))))
  }
  b<-cbind(id,a)
  c<-as.data.frame(b)
  c
  
}


#testing
complete(id=30:25)

输出:

查询:我用 na.omit 轻松解决了这个问题,但为什么会发生这种情况?

问题 2:从一开始就将 a 设置为数据框。 我尝试将 a 设置为数据框并生成解决方案,但我无法生成完整的数据框

#part 2
complete<-function(id=1:332){

  #(1)read the files
  file_names<-list.files(path = "specdata/",pattern = ".csv",full.names = TRUE)
  
  df<-data.frame()
  #returning the data frame
  for (i in id){
    complete_df<-rbind(df,sum(complete.cases(read.csv(file_names[i]))))
  } 
  
  colnames(complete_df)<-"nobs"
  complete_df
}


  #testing
complete(id=4:6)

我的输出:(它只返回 id 6)

我尝试了什么: 我在网上能找到的最接近的答案是How to get print function output into a dataframe

但是,我无法理解整个函数试图解释什么,我试着向上看这个 sapply 函数但无法理解它。

我对问题 #2 的问题: (1)根据stackoverflow,nobs可能在每次迭代中都发生了变化,并且之前的值被删除了。为什么会发生这种情况,即使我使用 rbind 而不仅仅是打印? (2) 这个 sapply 到底是做什么的?它与 rbind 有什么不同?我已经尝试查找该功能,但我完全失去了它的含义。

【问题讨论】:

    标签: r for-loop na sapply


    【解决方案1】:
    library(data.table)
    
    complete <- function(id = 1:332) {
      
      # only read the files for id's requested in the function call
      fileNames <- paste0("specdata/", str_pad(id, width = 3, side = c("left"), pad = 0), ".csv" )
      dt <- rbindlist(lapply(fileNames, fread))
      dt[complete.cases(dt), .(nobs = .N), by = ID]
    
    }
    
    complete(4:6)
    
    #    ID nobs
    # 1:  4  474
    # 2:  5  402
    # 3:  6  228
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-31
      • 1970-01-01
      • 2013-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多