Я новый пользователь R, и я ищу сценарий для извлечения определенных столбцов и строк таблицы. У меня есть формат файла осадков «.nc», загруженный в группу исследований климата, которая была преобразована в «.txt». Данные регистрируются с 1901 по 2014 год в месяц, и я хотел бы иметь только таблицу, показывающую данные, например, 1988 года (где будут отображаться широта, долгота и записи за 12 месяцев). Спасибо заранее.Как извлечь определенные элементы таблицы
ответ
Ваш вопрос довольно расплывчатый, поэтому очень сложно помочь вам. Вы говорите, что вы преобразовали файл 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
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
- 1. Как извлечь определенные элементы из массива?
- 2. Как разбить строку и извлечь определенные элементы?
- 3. Как извлечь определенные элементы из именованного списка?
- 4. Python SQLite3 Как извлечь только определенные таблицы
- 5. Как извлечь определенные ячейки таблицы HTML
- 6. Как извлечь определенные значения из таблицы mySQL с помощью php?
- 7. Извлечь определенные элементы из массива numpy по столбцу
- 8. Извлечь определенные ячейки слова
- 9. Соберите определенные элементы из потока
- 10. Как удалить определенные элементы матрицы?
- 11. Как захватить определенные элементы ввода?
- 12. Как слить только определенные элементы
- 13. Извлечь определенные строки, используя R
- 14. Как извлечь таблицы rtf
- 15. Извлечь определенные размеры из тензора
- 16. Как извлечь определенные цифры из цифр?
- 17. Как извлечь определенные данные из файла?
- 18. Как извлечь определенные символы в R Строка
- 19. Как извлечь определенные последовательности из фрейма данных?
- 20. SharpZipLib ~ Как извлечь определенные файлы из почтового
- 21. Как извлечь определенные строки в python
- 22. R: Как извлечь определенные цифры из строки?
- 23. Как извлечь определенные компоненты времени из UTCTime?
- 24. Как извлечь только определенные строки в VBA
- 25. Как «извлечь» определенные значения из массива?
- 26. Как извлечь определенные символы из строки
- 27. Как извлечь определенные HTML теги в Android
- 28. Как извлечь определенные типы путей в igraph?
- 29. Как извлечь определенные данные из данных XML
- 30. Как извлечь определенные данные из файлов HTML?
Предполагая, что вы читаете набор данных с помощью 'read.table/read.csv', мы можем использовать' subset' т.е. 'subset (yourdata, year == 1988)' Лучше показать несколько строк вашего набора данных. – akrun
Не имеет значения, каковы были ваши исходные форматы файлов. После того, как вы прочитали данные в R, его необходимо сохранить в объект R с именем. Сохраняются ли ваши данные в объекте 'data.frame'? – js86
Вы уверены, что это 1901 год? Я, хотя этот набор данных восходит к 1850 году ?? – jlhoward