在R中读取多个DBF文件

在R中读取多个DBF文件,r,csv,output,dbf,R,Csv,Output,Dbf,我在C:\Deskop\Test文件夹中有多个DBF文件。例如,我在下面列出了5个DBF文件名 week_1_avg_199811_var86_TBL.dbf week_1_avg_200510_var86_TBL.dbf week_2_avg_200009_var86_TBL.dbf week_2_avg_200309_var86_TBL.dbf week_3_avg_200011_var86_TBL.dbf 每个文件有5列和1410行。例如,(week_1_avg_199811_var86

我在C:\Deskop\Test文件夹中有多个DBF文件。例如,我在下面列出了5个DBF文件名

week_1_avg_199811_var86_TBL.dbf
week_1_avg_200510_var86_TBL.dbf
week_2_avg_200009_var86_TBL.dbf
week_2_avg_200309_var86_TBL.dbf
week_3_avg_200011_var86_TBL.dbf
每个文件有5列和1410行。例如,(week_1_avg_199811_var86_TBL.dbf)我将列出5行。列1到4在每个DBF文件中都是相同的

T_R          ZONE     COUNT     AREA         MEAN
T10S-R26W    1        1         0.0156       29.9412
T10S-R27W    1        1         0.0156       30.1242
T10S-R28W    1        1         0.0156       29.7399
T10S-R2E     1        1         0.0156       37.7858
T10S-R2W     1        1         0.0156       34.6999
我想输出一个CSV文件(output.CSV),读取上述(所有)DBF文件,如下所示

Output.csv

YEAR    T_R         Sep_week_1    Oct_week_1       Nov_week_1
1998    T10S-R26W   <some_value>       <some_value>     29.9412 
1998    T10S-R27W   <some_value>       <some_value>     30.1242 
1998    T10S-R28W   <some_value>       <some_value>     29.7399 
1998    T10S-R2E    <some_value>       <some_value>     37.7858 
1998    T10S-R2W    <some_value>      <some_value>      34.6999  
2005    T10S-R26W   <some_value>      <some_value>      <some_value>
2005    T10S-R27W   <some_value>      <some_value>      <some_value>
2005    T10S-R28W   <some_value>      <some_value>      <some_value>
2005    T10S-R2E    <some_value>       <some_value>     <some_value>
2005    T10S-R2W    <some_value>       <some_value>     <some_value>
感谢您的帮助


提前感谢。

这里的技巧是定义一个函数来读取
.dba
文件,并添加一个文件名标记。然后我们将使用
purrr:map\u dfr
读入,然后在一个步骤中读入每个文件

library(purrr)
library(foreign)

readDBA <- function(file){
  df <- read.dba(file, as.is=FALSE)
  df$fileName <- file
  return(df)
}

file.names <- list.files(pattern="*\\.dba")

combinedData <- file.names %>% map_dfr(readDBA)

此外,R还有一个方便的
month.abb
向量,因此您可以使用
month.abb[combinedData$month]

获得月份缩写。您可以使用
foreign::read.dbf()
OP在其代码中包含该缩写@Mako212@hrbrmstr这是在一篇社论中加上的。K然后OP只需查看
do.call
lappy
map\u df
类似任务的所有干部回答什么是OP?有人能解释一下需要做什么吗?谢谢。我想在上面的代码中创建周和月列。你能帮我按照上面的“输出”安排表格吗?再次感谢。请参见上面的图片了解输出。各列未填入“平均值”列中的相应值。如何使用“平均值”列中的值来填充这些列。请尝试
dcast(合并数据,年份+T\R~月周,value.var=“MEAN”)
非常感谢。谢谢你的帮助。成功了。:)
Using Month_Week as value column: use value.var to override.
library(purrr)
library(foreign)

readDBA <- function(file){
  df <- read.dba(file, as.is=FALSE)
  df$fileName <- file
  return(df)
}

file.names <- list.files(pattern="*\\.dba")

combinedData <- file.names %>% map_dfr(readDBA)
combinedData$Year <- gsub(".*_(\\d{4}).*", "\\1", combinedData$fileName)
combinedData$Month <- gsub(".*_\\d{4}(\\d{2}).*", "\\1", combinedData$fileName)
require(reshape2)

dcast(combinedData, Year + T_R ~ MonthWeek, value.var= "MEAN")