Подмножество матрицы по элементам и сохранение значений в виде матрицы

Мне нужно разбить матрицу на подмножество и сохранить результаты в виде матрицы, т.е. я хочу разбить все столбцы со значениями от 2 до 8 в 2 разных матрицах, а затем подмножество третьей матрицы по результату. первые две матрицы - это значения широты и долготы. Я пробовал вот так:

Lond<-c(2,9)
Latd<-c(2,9)
Newlon <-which(Lon > Lond[1] & Lon < Lond[2])
Newlat <-which(Lat > Latd[1] & Lat < Latd[2])

Другой вариант, который я пробовал, был

index <- which(lat >= 2 & lat <= 9 & lon >= 2 & lon <= 9)

Это сделало подмножество всех номеров ячеек, но я хочу, чтобы он сохранялся в виде сетки или матрицы строк и столбцов, поскольку он возвращал линейный массив. Мне нужно, чтобы в качестве матрицы оставались только строки и столбцы, которые имеют эти значения, чтобы я мог подмножество другой матрицы «Данные», которая имеет фактические значения, чтобы я мог затем использовать подмножество.

New<-Data[Newlon,Newlat]

Файл доступен здесь: Ссылка

Файлы, извлеченные из файла hdf5 с использованием rhdf5, таким образом

lon<-h5read ("M1.he5","HDFEOS/SWATHS/ColumnAmountNO2/Geolocation Fields/Longitude")
lat<-h5read ("M1.he5","HDFEOS/SWATHS/ColumnAmountNO2/Geolocation Fields/Latitude")
Data<-h5read ("M1.he5","HDFEOS/SWATHS/ColumnAmountNO2/Data Fields/ColumnAmountNO2Trop")

Как мне это сделать?


person Joke O.    schedule 18.03.2014    source источник
comment
Я не уверен, но вам может понадобиться аргумент arr.ind = T для which?   -  person alexis_laz    schedule 18.03.2014
comment
привет Алексис, я не понимаю, что вы имели в виду под arr.ind = T   -  person Joke O.    schedule 18.03.2014
comment
Можете ли вы предоставить небольшой образец ваших исходных матриц, чтобы другие могли его опробовать? У нас нет Lon, Lat, lon или lat, поэтому мы не можем воспроизвести то, что вы делаете.   -  person Jota    schedule 18.03.2014
comment
См. ?which для просмотра справочной информации, включая объяснение аргумента arr.ind.   -  person Jota    schedule 18.03.2014
comment
[ссылка] (dropbox.com/sh/t521gr1rpijmkt9/vuo8Y9tpZw) Чтобы извлечь данные из файлы hdf5:   -  person Joke O.    schedule 18.03.2014
comment
Привет, Фрэнк и Алексис, я просто добавил немного больше информации к вопросу, включая ссылку для загрузки наборов данных.   -  person Joke O.    schedule 18.03.2014
comment
Думаю, то, что вы хотите делать, немного сбивает с толку. Для простоты был бы очень полезен небольшой пример, в котором вы показываете ожидаемые результаты. Кажется, было бы понятнее использовать небольшой пример, чем загружать все свои данные. С этой целью вот несколько примеров данных для lon и lat, которые вы можете использовать для иллюстрации проблемы: set.seed(1); lon <- matrix(runif(100,-15,15),ncol=10); и lat <- matrix(runif(100,-15,15),ncol=10)   -  person Jota    schedule 18.03.2014
comment
Я думаю, что этот образец весьма разнообразен. строки и столбцы увеличиваются по мере вашего движения. например, столбец 1, строка 1 может быть 2, а столбец 6, строка 4 может быть 8. Это матрица местоположений x и y, где значения x хранятся в значениях lon и y, хранящихся в y. Я бы попробовал загрузить нарисованный.   -  person Joke O.    schedule 18.03.2014
comment
это не позволяет мне загружать. Я только что загрузил изображение в Dropbox, чтобы вы могли видеть изображение нанесенных данных hdf5 в том виде, в каком оно есть. я хотел бы разбить его на географические границы жирным черным цветом [ссылка] (dropbox.com/s/euxda4wp83kwfbc/Jan%20NO2.tif?m=) он идеально подмножества с использованием определенных экстентов строк и столбцов, но мне нужны географические экстенты, поскольку я должен делать то же самое в разные дни для та же область (из-за расположения спутника, она может не совпадать идеально, так как одна ячейка на 1-й день может быть 3-й на 5-й день)   -  person Joke O.    schedule 18.03.2014


Ответы (1)


Вот несколько примеров данных:

lon <- matrix(seq(-10,9.8,by=0.2),ncol=10,byrow=T)
lat <- matrix(seq(-10,9.8,by=0.2),ncol=10,byrow=T)
lon # which is the same as lat in this example:
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]  -10 -9.8 -9.6 -9.4 -9.2   -9 -8.8 -8.6 -8.4  -8.2
 [2,]   -8 -7.8 -7.6 -7.4 -7.2   -7 -6.8 -6.6 -6.4  -6.2
 [3,]   -6 -5.8 -5.6 -5.4 -5.2   -5 -4.8 -4.6 -4.4  -4.2
 [4,]   -4 -3.8 -3.6 -3.4 -3.2   -3 -2.8 -2.6 -2.4  -2.2
 [5,]   -2 -1.8 -1.6 -1.4 -1.2   -1 -0.8 -0.6 -0.4  -0.2
 [6,]    0  0.2  0.4  0.6  0.8    1  1.2  1.4  1.6   1.8
 [7,]    2  2.2  2.4  2.6  2.8    3  3.2  3.4  3.6   3.8
 [8,]    4  4.2  4.4  4.6  4.8    5  5.2  5.4  5.6   5.8
 [9,]    6  6.2  6.4  6.6  6.8    7  7.2  7.4  7.6   7.8
[10,]    8  8.2  8.4  8.6  8.8    9  9.2  9.4  9.6   9.8

set.seed(1)
# I'm using print and digits=1 here for making the example easy to look at.
Data <- print(matrix(runif(100, 400, 500),ncol=10),digits=1); Data 
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]  427  421  493  448  482  448  491  434  443   424
 [2,]  437  418  421  460  465  486  429  484  471   406
 [3,]  457  469  465  449  478  444  446  435  440   464
 [4,]  491  438  413  419  455  424  433  433  433   488
 [5,]  420  477  427  483  453  407  465  448  476   478
 [6,]  490  450  439  467  479  410  426  489  420   480
 [7,]  494  472  401  479  402  432  448  486  471   446
 [8,]  466  499  438  411  448  452  477  439  412   441
 [9,]  463  438  487  472  473  466  408  478  425   481
[10,]  406  478  434  441  469  441  488  496  414   460

Не совсем понятно, каким должен быть желаемый результат. Если я правильно понимаю вопрос, OP хочет сохранить значения из Data, где соответствующие значения lon и lat находятся между 2 и 8. Форма вывода - это то, о чем я не понимаю. Этот ответ сохраняет матрицу и превращает все значения, не соответствующие критериям, в NA:

Data[!(lon > 2 & lon < 8)] <- NA
Data[!(lat > 2 & lat < 8)] <- NA
print(Data, digits=1)

       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA
 [2,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA
 [3,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA
 [4,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA
 [5,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA
 [6,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA
 [7,]   NA  472  401  479  402  432  448  486  471   446
 [8,]  466  499  438  411  448  452  477  439  412   441
 [9,]  463  438  487  472  473  466  408  478  425   481
[10,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA

Лично я, вероятно, сделал бы что-то подобное, но OP явно упоминает работу с матрицами и их возврат:

# need to redefine Data from above. 
set.seed(1);Data <- matrix(runif(100, 400, 500),ncol=10)
newdat <- cbind(lon = as.vector(lon),
                lat = as.vector(lat),
                Data = as.vector(Data))

newdat[lon>2 & lon<8 & lat>2 & lat<8,]
person Jota    schedule 18.03.2014
comment
Браво, Фрэнк! это сработало. Первое решение сработало для меня лучше, так как я смог изобразить его как изображение. - person Joke O.; 19.03.2014
comment
Привет, Фрэнк. Что, если я хочу сохранить их как список матриц вместо Print. Какие функции это было бы в R, пожалуйста? Это поможет мне создать временной ряд на основе моих результатов. - person Joke O.; 19.03.2014
comment
@JokeO. Что ж, есть функция list. Вы также можете найти lapply и / или sapply полезными. - person Jota; 19.03.2014