我对nc文件有以下代码。此代码使我的工作目录中存在的所有netcdf文件都成为单独的csv文件。它将数据按行排列。它跳过经度和纬度,甚至跳过名称或序列号,并替换为V1,V2等。
有人可以帮助我,为什么它不包括纬度/经度,甚至不包括序列号,为什么它在第一行显示为V1,V2,V3?
如何在1个单个csv文件中获取所有nc文件的数据。我的意思是单个csv输出文件应包含标题的csv的第一行(第一行)(站点名称或序列号,或者甚至是V1,V2,...),第一nc文件数据应包含第二行,第二nc文件数据应包含第三行,第3行nc文件数据的第4行等。
我附上了具有坐标和1个nc文件的1个单个csv输出的输入csv的图片。
library(ncdf4)
library(raster)
setwd("F:\\research\\1_Rainfall\\CDC\\test")
files <- list.files(pattern="*.nc")
print(files)
ncname <- files[1:3]
ncfname <- paste(ncname, sep="")
library(raster)
dname <- "precip" # note: variable precipitation or temperature
for(i in 1:3){
ncin1 <- brick(ncfname[i])
s = read.csv("F:\\research\\1_Rainfall\\CDC\\test\\Remaining_Points.csv",
stringsAsFactors = FALSE)
coordinates(s)= ~lon + lat
e <- extract(ncin1, s)
ts1 <- round((e),1)
df <- as.data.frame(t(ts1))
write.csv(df,
file = paste0("F:\\research\\1_Rainfall\\CDC\\test\\precip", i, ".csv"),
append=FALSE, sep= ",", row.names = TRUE, col.names=TRUE)
}
答案 0 :(得分:1)
提出问题时,请提供一个简单的可复制示例。并尝试将您的问题分成几部分。您有两个问题(1)如何存储按行提取的数据,以及(2)如何追加到文件。我会回答#1,因为您可能不需要#2。
library(raster)
files <- rep(system.file("external/rlogo.grd", package="raster"), 3)
xy <- matrix(c(48, 48, 48, 53, 50, 46, 54, 70, 84, 85, 74, 84, 95, 85,
66, 42, 26, 4, 19, 17, 7, 14, 26, 29, 39, 45, 51, 56, 46, 38, 31,
22, 34, 60, 70, 73, 63, 46, 43, 28), ncol=2)
stations <- letters[1:nrow(xy)]
outf <- "precip.csv"
d <- data.frame(t(xy))
colnames(d) <- stations
d <- cbind(file="", var=c("x", "y"), d)
for(i in 1:length(files)){
nc <- brick(files[i])
e <- t(extract(nc, xy))
colnames(e) <- stations
v <- data.frame(file=basename(files[i]), var=names(nc), e)
d <- rbind(d, v)
}
rownames(d) <- NULL
head(d)
现在只需一步即可将结果写入csv
write.csv(d, outf)
如果您必须逐块编写csv,则可以执行以下操作:
d <- data.frame(t(xy))
colnames(d) <- stations
d <- cbind(file="", var=c("x", "y"), d)
outf <- "precip.csv"
if (file.exists(outf)) file.remove(outf)
write.csv(d, outf, row.names=FALSE)
for(i in 1:length(files)){
nc <- brick(files[i])
e <- t(extract(nc, xy))
colnames(e) <- stations
v <- data.frame(file=basename(files[i]), var=names(nc), e)
write.table(v, outf, append=TRUE, row.names=FALSE, col.names=FALSE, sep=",")
}
并检查:
read.csv(outf)
您的代码经过一些整理后可能看起来像这样:
库(ncdf4) 图书馆(光栅)
files <- list.files(pattern="*.nc")
library(raster)
s <- read.csv("Remaining_Points.csv", stringsAsFactors = FALSE)
xy <- s[, c("lon", "lat")]
stations <- s$stationname
for(i in 1:length(files)){
nc <- brick(files[i])
e <- t(round(extract(nc, xy), 1))
# etc
}
现在,我认为您应该真正考虑将值添加为列,因为这非常容易。 (然后可能在需要时根据需要重塑形状)