2015-09-07 5 views
-1

Я новый пользователь R, и я ищу сценарий для извлечения определенных столбцов и строк таблицы. У меня есть формат файла осадков «.nc», загруженный в группу исследований климата, которая была преобразована в «.txt». Данные регистрируются с 1901 по 2014 год в месяц, и я хотел бы иметь только таблицу, показывающую данные, например, 1988 года (где будут отображаться широта, долгота и записи за 12 месяцев). Спасибо заранее.Как извлечь определенные элементы таблицы

+1

Предполагая, что вы читаете набор данных с помощью 'read.table/read.csv', мы можем использовать' subset' т.е. 'subset (yourdata, year == 1988)' Лучше показать несколько строк вашего набора данных. – akrun

+0

Не имеет значения, каковы были ваши исходные форматы файлов. После того, как вы прочитали данные в R, его необходимо сохранить в объект R с именем. Сохраняются ли ваши данные в объекте 'data.frame'? – js86

+0

Вы уверены, что это 1901 год? Я, хотя этот набор данных восходит к 1850 году ?? – jlhoward

ответ

0

Ваш вопрос довольно расплывчатый, поэтому очень сложно помочь вам. Вы говорите, что вы преобразовали файл ncdf в текстовый файл. Как? Каков формат этого файла (что находится в столбцах строк?)? Как мы должны знать?

Тем не менее, это должно заставить вас начать.

library(ncdf) 
url <- "http://www.cru.uea.ac.uk/cru/data/temperature/CRUTEM.4.4.0.0.anomalies.nc" 
tf <- tempfile() 
download.file(url, tf, mode="wb") 
nc <- open.ncdf(tf) 
nc 
# [1] "file C:\\Users\\jlh\\AppData\\Local\\Temp\\RtmpgPupyr\\filed2c1853163f has 4 dimensions:" 
# [1] "latitude Size: 36" 
# [1] "longitude Size: 72" 
# [1] "time Size: 1987" 
# [1] "field_status_string_length Size: 1" 
# [1] "------------------------" 
# [1] "file C:\\Users\\jlh\\AppData\\Local\\Temp\\RtmpgPupyr\\filed2c1853163f has 2 variables:" 
# [1] "float temperature_anomaly[longitude,latitude,time] Longname:temperature_anomaly Missval:-1.00000001504747e+30" 
# [1] "char field_status[field_status_string_length,time] Longname:field_status Missval:NA" 


x <- get.var.ncdf(nc, "longitude") 
y <- get.var.ncdf(nc, "latitude") 
t <- get.var.ncdf(nc, "time") 
z <- get.var.ncdf(nc, "temperature_anomaly") 
str(z) 
# num [1:72, 1:36, 1:1987] NA NA NA NA NA NA NA NA NA NA ... 

Так что этот код загружает аномалии температуры ncdf файл с Отделом исследований климата Университета Восточной Англии (http://www.cru.uea.ac.uk/data), используя ncdf пакет в R. Вы можете видеть, что этот файл имеет атрибуты latitude, longitude , time и status_length и две переменные ответа: temperature_anomaly и field_status.

Звонки на get.var.ncdf(...) извлекают долготу, широту и временные масштабы, а затем фактические данные. Последний находится в 3-мерной матрице, z (одно измерение для лата, одно длинное, одно для времени).

Из вашего вопроса я хочу, чтобы вы получили «таблицу» (не содержательную идею в R), показывающую ответ (я выбрал временную аномалию для этого примера), наряду с lat, long и date для каждой комбинации из лат/долго и каждый месяц в 1988 году. Но я только угадываю здесь, потому что вы действительно ничего не говорите нам.

Так что это действительно упражнение по преобразованию матрицы z в формат выше. Мы можем сделать это легко, используя melt(...) в пакете reshape2 (ознакомьтесь с документацией). Единственный сложный бит - интерпретация time. Согласно сайту CRU, время хранится как количество дней с 1850-01-01 (где вы получили 1900 из?), С шагом в 29,5 дней (так что одна точка в месяц. Линии 2: 4 ниже конвертируют год (например, 1988) в вектор индексов в временном измерении z.

library(reshape2) # for melt(...) 
yr <- 1988 
st <- (yr-1850)*12+1 
indx <- st:(st+11) 
m <- z[,,indx] 
dimnames(m) <- list(x,y,strftime(as.Date("1850-01-01")+t[indx],format="%b-%Y")) 
result  <- melt(m, varnames=c("longitude", "latitude", "date"), value.name="temp") 
# longitude latitude  date temp 
# 1 -177.5 -87.5 Jan-1988 NA 
# 2 -172.5 -87.5 Jan-1988 NA 
# 3 -167.5 -87.5 Jan-1988 NA 
# 4 -162.5 -87.5 Jan-1988 NA 
# 5 -157.5 -87.5 Jan-1988 NA 
# 6 -152.5 -87.5 Jan-1988 NA 
0
Thank you dear **jlhoward** for your well detailed answer. I found a solution to my problem and here is the script that I used: 

Folder="C:/cru2/Pre/" 

file=paste(folder,"Precipitation_1901-2014.txt",sep="") 

data=read.table(file,header=T,sep="\t") 

years=1901:2014 
cumulyears=data[,1:2] 

nyr=0 
n2=2 

for (yrs in annees){ 
    nyr=nyr+1 
    n1=n2+1 
    n2=n1+11 

    datayrs=cbind(data[,1:2],data[,n1:n2]) 

    output=paste(folder,yrs,".txt",sep="") 

    write.table(datayrs, file = output, append = FALSE,sep = "\t",eol = "\r", na = "NA", dec = ".", row.names = F,col.names = F) 

    row.sums <- apply(data[,n1:n2], 1, sum,na.rm=T) 

    cumulyears=cbind(cumulyears,row.sums) 

} 

colnames(cumulyears)=c("Latitude","Longitude",years) 

output=paste(folder,"precipitationyears.txt",sep="") 

write.table(cumulyears, file = output, append = FALSE,sep = "\t",eol = "\r", na = "NA", dec = ".", row.names = F,col.names = T) 

I did not try yet what you have proposed but I will do so in a brief delay inshAllah. About your question on how I have converted a ".nc" to ".txt" below is the script I have used. Here is also the Climate Research Unit link where I got my data (http://www.cru.uea.ac.uk/cru/data/hrg/cru_ts_3.23/cruts.1506241137.v3.23/). Thanks again. 

library("ncdf") 
library("chron") 

Folder="C:/cru2" 

variable="pre" 

periodes1=c(1901,1911,1921,2011) 
periodes2=c(2014,1920,1930,2014) 

nbyrs=length(periodes1) 

for (ip in 1:1){ 

    name=paste("cru_ts3.23.",periodes1[ip],".",periodes2[ip],".",variable,".dat",sep="") 

    years=c(periodes1[ip],periodes2[ip]) 

    file=paste(folder,name,".nc",sep="") 

    x <- open.ncdf("cru_ts3.23.1901.2014.pre.dat.nc") 

    mrlon_t = get.var.ncdf(x,"lon") #Longitude 
    mrlat_t = get.var.ncdf(x,"lat") #Latitude 
    lonmin=-18 
    lonmax=26 
    latmin=3.4 
    latmax=17 

    mrlon=mrlon_t[mrlon_t>=lonmin&mrlon_t<=lonmax] 
    lon=length(mrlon) 
    lo1=which(mrlon_t==mrlon[1]) 

    mrlat=mrlat_t[mrlat_t>=latmin&mrlat_t<=latmax] 
    lat=length(mrlat) 
    la1=which(mrlat_t==mrlat[1]) 

    mpr= get.var.ncdf(x,varid=variable,start=c(lo1,la1,1),count=c(lon,lat,-1)) 
    mrtime=get.var.ncdf(x,"time") 
    mrtime=mrtime/86400 
    #dim1=c(dim(matrice)) 

    ts=length(mrtime) 

    print(paste("Nb days ",ts,sep="")) 

    date1=paste(years[1],"-01-01",sep="") 
    date2=paste(years[2],"-12-31",sep="") 
    date=seq(as.Date(date1), as.Date(date2), "months") 

    #for (t in 1:ts) {date[t]<-t} 

    d1=lon*lat+1 
    d2=ts+2 
    mpr_sortie = array(NA, c(d1,d2)) 

    mpr_sortie[1,1]="latitude" 
    mpr_sortie[1,2]="longitude" 

    for (t in 1:ts) {mpr_sortie[1,t+2]<-as.character(date[t])} 

    for (la in 1:lat) { 
    for (lo in 1:lon) { row=(la-1)*lon+lo+1 
         mpr_sortie[row,1]<-mrlat[la] 
         mpr_sortie[row,2]<-mrlon[lo] 

         for (t in 1:ts) { rcol=t+2 

              mpr_sortie[row,rcol]<-mpr[lo,la,t] 
         } 
    } 
    } 

    file=paste(folder,name,".txt",sep="") 

    write.table(mpr_sortie, file = "file", append = FALSE, sep ="\t", eol = "\r", na = "NA", dec = ".", row.names =FALSE, col.names =FALSE) 

}#End for 
Смежные вопросы