2013-10-08 3 views
0

У меня есть эта матрица (голова и хвост приводится ниже), и у него есть широта, долгота и переменную для США в течение периода времени начинается с января 1948 года по декабрь 2004 года:изменить матрицу в г

# head of matrix 
    lon lat month value 
1 -124.5 31.5 1980.1 NA 
2 -123.5 31.5 1980.1 NA 
3 -122.5 31.5 1980.1 NA 
4 -121.5 31.5 1980.1 NA 
5 -120.5 31.5 1980.1 NA 
6 -119.5 31.5 1980.1 NA 

# tail of matrix 
      lon lat month value 
[129595,] -106.5 48.5 2004.12  0 
[129596,] -105.5 48.5 2004.12  0 
[129597,] -104.5 48.5 2004.12 71 
[129598,] -103.5 48.5 2004.12 NA 
[129599,] -102.5 48.5 2004.12 NA 
[129600,] -101.5 48.5 2004.12 NA 

Я хочу, чтобы изменить его в этой форме, за каждый месяц года, например, это в январе 1980 года:

lon....> 31.5  32.5  33.5 ....  48.5 
lat -101.5 value11 value12  value13 
. -102.5 .... 
. -103.5 
. . 
\/ .       value ii 

есть ли способ, что я могу сделать это?

+1

возможный дубликат [Переформуйте три столбца кадра данных в матрице] (HTTP: // stackoverflow.com/questions/9617348/reshape-three-column-data-frame-to-matrix) – Frank

ответ

1
> dat <- read.table(text="lon lat month value 
+ -124.5 31.5 1980.1 2 
+ -123.5 31.5 1980.1 3 
+ -122.5 31.5 1980.1 4 
+ -121.5 31.5 1980.1 5 
+ -120.5 31.5 1980.1 6 
+ -119.5 31.5 1980.1 7 
+ -106.5 48.5 2004.12  0 
+ -105.5 48.5 2004.12  0 
+ -104.5 48.5 2004.12 71 
+ -103.5 48.5 2004.12 8 
+ -102.5 48.5 2004.12 9 
+ -101.5 48.5 2004.12 0", header=TRUE) 
> xtabs(value~lat+lon+month, data=dat, exclude="") 
, , month = 1980.1 

     lon 
lat -124.5 -123.5 -122.5 -121.5 -120.5 -119.5 -106.5 -105.5 -104.5 -103.5 
    31.5  2  3  4  5  6  7  0  0  0  0 
    48.5  0  0  0  0  0  0  0  0  0  0 
     lon 
lat -102.5 -101.5 
    31.5  0  0 
    48.5  0  0 

, , month = 2004.12 

     lon 
lat -124.5 -123.5 -122.5 -121.5 -120.5 -119.5 -106.5 -105.5 -104.5 -103.5 
    31.5  0  0  0  0  0  0  0  0  0  0 
    48.5  0  0  0  0  0  0  0  0  71  8 
     lon 
lat -102.5 -101.5 
    31.5  0  0 
    48.5  9  0 
+0

Спасибо за ваш ответ. Я не знаю, почему он не работает с моими данными, когда я просто копирую все данные между этими командами, строка которых не работает, потому что при запуске она не отображает пробел между значениями и другими переменными. это сообщение об ошибке: Ошибка в сканировании (файл, что, nmax, sep, dec, quote, skip, nlines, na.strings,: строка 2 не имела 4 элементов – SaZa

0
library(reshape2) 

dcast(mat, id.var=NULL,formula = month+lon ~ lat, value.var="value") 
1

dcast из reshape2 является вашим другом в этой ситуации. Предположим, что ваш data.frame называется df

> library(reshape2) 
> dcast(df, lat + month ~lon) 
    lat month -124.5 -123.5 -122.5 -121.5 -120.5 -119.5 
1 31.5 1980.1  NA  NA  NA  NA  NA  NA 

Давайте заменить NA с некоторыми случайными значениями, чтобы увидеть, как это работает

> set.seed(1) 
> df[,4 ] <- sample(20:60, 6) 
> df # this is how the new df looks like 
    lon lat month value 
1 -124.5 31.5 1980.1 30 
2 -123.5 31.5 1980.1 34 
3 -122.5 31.5 1980.1 42 
4 -121.5 31.5 1980.1 54 
5 -120.5 31.5 1980.1 27 
6 -119.5 31.5 1980.1 52 

> dcast(df, lat + month ~lon) # here's the job done by `dcast` 
    lat month -124.5 -123.5 -122.5 -121.5 -120.5 -119.5 
1 31.5 1980.1  30  34  42  54  27  52 
Смежные вопросы