Цикл для кода nc и упорядочить строку данных - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть следующий код для файлов nc.Этот код создает отдельный CSV-файл для всех файлов Netcdf, присутствующих в моем рабочем каталоге.Это устраивает строку данных мудро.Он пропускает долготу и широту и даже имя или серийный номер и заменяет его V1, V2 и так далее.

Кто-нибудь может мне помочь, почему он не включает широту / долготу или даже серийный номер и почему он показывает верхнюю строку как V1, V2, V3?

Как я могу получить данныеиз всех файлов nc в одном файле CSV.Я имею в виду, что один выходной файл csv должен содержать верхнюю (первую) строку csv для заголовка (названия станций или серийные номера или, если даже V1, V2, ...) и 2-ю строку для данных 1-го файла nc, 3-ю строку для данных 2-го файла nc, 4-я строка для данных 3-го файла nc и так далее.

Я приложил изображения входного CSV, имеющего координаты и 1 отдельный вывод CSV для 1 файла NC.

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)
}

1 Ответ

0 голосов
/ 25 февраля 2019

Пожалуйста, предоставьте простой воспроизводимый пример, когда вы задаете вопрос.И попробуйте разбить ваш вопрос на части.У вас есть два вопроса (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
}

Теперь я думаю, что вам действительно следует подумать о добавлении значений в виде столбцов, поскольку это намного проще.(а затем, возможно, при необходимости измените форму)

...