在 R 中读取多个 DBF 文件
Read multiple DBF files in R
我在 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 行。每个 DBF 文件中的第 1 列到第 4 列是相同的。
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>
有人可以帮助我如何在 R 中实现这一点吗?
我有以下代码读取文件夹中的所有 .dbf 文件,但我需要通过读取文件名来创建 YEAR 和每周值列。
rm(list=ls(all=TRUE))
setwd("C:/Deskop/Test")
graphics.off()
library("foreign")
library("purrr")
readDBA <- function(file){
df <- read.dbf(file, as.is=FALSE)
df$fileName <- file
return(df)
}
file.names <- list.files(pattern="*\.dbf")
combinedData <- file.names %>% map_dfr(readDBA)
combinedData$Year <- gsub(".*_(\d{4}).*", "\1", combinedData$fileName)
combinedData$Month <- as.numeric(gsub(".*_\d{4}(\d{2}).*", "\1", combinedData$fileName))
combinedData$Month_Abb <- month.abb[combinedData$Month]
combinedData$Week <- substr(combinedData$fileName, 6, 6)
cols <- c("Month_Abb","Week")
combinedData$Month_Week <- do.call(paste, c(combinedData[cols], sep="_wk"))
DT <- dcast(combinedData, Year + T_R + Month_Week + MEAN ~ Month_Week)
查看 "Output.csv" 文件的图像。
Using Month_Week as value column: use value.var to override.
感谢任何帮助,
提前致谢。
这里的技巧是定义一个函数来读取.dba
文件,并添加一个文件名标签。然后我们将使用 purrr:map_dfr
读入,然后 rbind()
每个文件一步到位。
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)
我会让你想办法把周和月放在一起。
然后你会想要 reshape2::dcast()
一个宽格式,像这样但是我不能肯定地说,除非你提供你的数据框的实际样本。
require(reshape2)
dcast(combinedData, Year + T_R ~ MonthWeek, value.var= "MEAN")
此外,R 有一个方便的 month.abb
向量,因此您可以使用 month.abb[combinedData$Month]
获取月份缩写
我在 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 行。每个 DBF 文件中的第 1 列到第 4 列是相同的。
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>
有人可以帮助我如何在 R 中实现这一点吗?
我有以下代码读取文件夹中的所有 .dbf 文件,但我需要通过读取文件名来创建 YEAR 和每周值列。
rm(list=ls(all=TRUE))
setwd("C:/Deskop/Test")
graphics.off()
library("foreign")
library("purrr")
readDBA <- function(file){
df <- read.dbf(file, as.is=FALSE)
df$fileName <- file
return(df)
}
file.names <- list.files(pattern="*\.dbf")
combinedData <- file.names %>% map_dfr(readDBA)
combinedData$Year <- gsub(".*_(\d{4}).*", "\1", combinedData$fileName)
combinedData$Month <- as.numeric(gsub(".*_\d{4}(\d{2}).*", "\1", combinedData$fileName))
combinedData$Month_Abb <- month.abb[combinedData$Month]
combinedData$Week <- substr(combinedData$fileName, 6, 6)
cols <- c("Month_Abb","Week")
combinedData$Month_Week <- do.call(paste, c(combinedData[cols], sep="_wk"))
DT <- dcast(combinedData, Year + T_R + Month_Week + MEAN ~ Month_Week)
查看 "Output.csv" 文件的图像。
Using Month_Week as value column: use value.var to override.
感谢任何帮助,
提前致谢。
这里的技巧是定义一个函数来读取.dba
文件,并添加一个文件名标签。然后我们将使用 purrr:map_dfr
读入,然后 rbind()
每个文件一步到位。
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)
我会让你想办法把周和月放在一起。
然后你会想要 reshape2::dcast()
一个宽格式,像这样但是我不能肯定地说,除非你提供你的数据框的实际样本。
require(reshape2)
dcast(combinedData, Year + T_R ~ MonthWeek, value.var= "MEAN")
此外,R 有一个方便的 month.abb
向量,因此您可以使用 month.abb[combinedData$Month]