Цикл для кода nc и упорядочивание данных по строкам

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

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

Как я могу получить данные всех файлов nc в одном файле csv. Я имею в виду, что один выходной файл csv должен содержать верхнюю (1-ю) строку 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)
}

person Sikandar Ali    schedule 25.02.2019    source источник


Ответы (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
}

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

person Robert Hijmans    schedule 25.02.2019
comment
Сэр, у меня есть nc файлов с ежедневными осадками за год. Код, который я написал, извлекает значения с использованием координат (CSV-файл) и выводит CSV-файл ежедневно, имея верхнюю строку как V1, V2, V3 и вторую строку в качестве значений. Здесь V1, V2, V3 представляют станции (координаты). Я хочу, чтобы на выходе был один CSV-файл с верхней строкой как V1, V2, V3, а в следующих строках CSV должны быть данные. Это означает, что в строке 2 должны быть данные 1-го файла NC, а в строке 3 должны быть данные 2-го файла NC ....... в строке 366 должны быть значения 365-го файла NC. Мне нужен один вывод csv, пожалуйста. - person Sikandar Ali; 25.02.2019
comment
Сэр, я пробовал эти файлы ‹- list.files(pattern=*.nc) library(raster) s ‹- read.csv(Remaining_Points.csv, stringsAsFactors = FALSE) xy ‹- s[, c(lon, lat )] station ‹- s$имя_станции for(i in 1:length(files)){ nc ‹- кирпич(файлы[i]) e ‹- t(round(extract(nc, xy), 1)) # и т.д. } это очень хорошо, но единственная проблема заключается в том, что он предоставляет один файл csv для каждого файла nc. Пожалуйста, помогите мне, как получить вывод всего файла nc в одном файле csv в последовательных столбцах, пожалуйста - person Sikandar Ali; 25.02.2019