在R中读取多个DBF文件
我在C:\Deskop\Test文件夹中有多个DBF文件。例如,我在下面列出了5个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
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")