首页 > 解决方案 > 在 R 中的 for 循环中实现列表以从多个 dbfs 生成列名和数据类型表

问题描述

我正在尝试从多个 dbfs 中提取列名和关联的数据类型,并将结果放入表中以交叉引用哪些列名和数据类型出现在哪些 dbfs 中。我为此编写了一个初始 R 脚本作为试用版,仅使用两个 dbfs,它运行良好。问题是当我尝试调整脚本以迭代许多 dbfs 时,我不能完全得到正确的结果。

两个 dbfs 的脚本是:

library(foreign)
dbf05 <- read.dbf("path/data05.dbf")
dbf06 <- read.dbf("path/data06.dbf")

dbf05ColnamesDT <- lapply(dbf05,class)
dbf06ColnamesDT <- lapply(dbf06,class)
ColnamesDTList <- list(dbf05ColnamesDT, dbf06ColnamesDT)

maxLength <- max(lengths(ColnamesDTList)) #Get the max length of the lists in ColnamesDTList

#Create a df from the nested list, with equal length columns
ColnamesDTDf <- as.data.frame(do.call(rbind, lapply(ColnamesDTList, `length<-`, maxLength)))

#Rename rows
years <- 2005:2006
new.names <-NULL
for(i in 1:2){
  new.names[i]<-paste("dbf", years[i], sep="")
}
row.names(ColnamesDTDf)<-new.names

这会产生一个像这样的表,这正是我想要的:

        cname1  cname2  cname3  cname4  cname5  cname6  
dbf2005 factor  factor  numeric numeric factor  factor  
dbf2006 numeric factor  numeric factor  numeric NULL    

我的迭代脚本是:

library(foreign)
files <- list.files("path/", full.names = TRUE, pattern = "*.dbf$") #List files

BBcolnamesDTList <- list()
for (i in 1:14){
  dbfs <- read.dbf(files[i])
  ColnamesDT <- lapply(dbfs,class)
  ColnamesDTList[[i]] <- list(ColnamesDT)
}

maxLength <- max(lengths(ColnamesDTList))
ColnamesDTDf <- as.data.frame(do.call(rbind, lapply(ColnamesDTList, `length<-`, maxLength)))

years <- 2005:2018
new.names <-NULL
for(i in 1:14){
  new.names[i]<-paste("dbf", years[i], sep="")
}
row.names(ColnamesDTDf)<-new.names

这将生成一个表,其中只有一列包含列名列表:

        V1
dbf2005 list(cname1 = “factor”, cname2 = “factor”, cname3 = “numeric”, …        
dbf2006 list(cname1 = “numeric”, cname3 = “factor”, cname4 = “numeric”,…

另外,'''maxLength'''在第一个脚本中返回34但在迭代脚本中只返回1,这告诉我我在for循环中的列表结构不正确但我不确定如何正确实现它.

标签: rlistfor-looplapply

解决方案


推荐阅读