2013-03-04 1 views
3

행렬로 변환하려는 LON, LAT, VALUE의 큰 데이터 프레임 (100,000 행)이 있습니다. (EPSG의 좌표 : 3035). 공간 데이터 xyz - 행렬

나는 멋지고 일 다음 명령

acast(df, lon~lat, value.var="value") 

으로 reshape2 패키지를 시도했다.

좌표를 'EPSG : 4326'으로 변환하고 같은 코드를 실행하면 오류가 발생합니다. 아래의 하나의 코드가 작동처럼 재현 예를 들어

str(df1) 
data.frame': 168643 obs. of 3 variables: 
$ x: num 28 28.1 27.8 28 28.1 ... 
$ y: num 71.1 71 71 71 71 ... 
$ z: num 0.0893 0.093 0.085 0.0886 0.0924 ... 
> aa=acast(df1, x~y, value.var="z") 
Error in seq_len(n) : argument must be coercible to non-negative integer 
In addition: Warning message: 
In match(seq_len(n), overall, nomatch = NA) : NAs introduced by coercion 

,하지만 난이 같은 대규모 데이터 프레임을 왜, 내가 오류를 얻고있다. 그것은 좌표의 변형으로 무엇이든해야만합니다.

x=c(-8.084929925, -8.01229693, -7.939629855, -7.866928803, -7.794193877, -7.721425179, -7.648622813, -7.575786885, -7.502917498, -7.430014757, -7.357078769, -7.284109638, -7.211107472, -7.138072377, -7.065004461, -6.99190383) 


y=c(53.07977473, 53.09085897, 53.10189964, 53.11289671, 53.12385014, 53.1347599, 53.14562596, 53.15644829, 53.16722685, 53.17796162, 53.18865255, 53.19929962, 53.2099028, 53.22046205, 53.23097734, 53.24144865) 

z=c(0.065, 0.063, 0.062, 0, 0, 0, 0.061, 0.062, 0.064, 0.06, 0.069, 0.074, 0.079, 0.08, 0.092, 0.10) 

df=data.frame(x,y,z) 
acast(df, x~y, value.var="z") 

의견이 있으십니까?

+1

예제를 재현 할 수 있습니까? –

+0

은 다음 데이터와 함께 작동합니다 :'df

+0

@PaulHiemstra 작은 재현 가능한 예제를 추가했습니다. . – Nav

답변

1

이 정말 제공하는 예를 들어이 아니었다 데이터 주어진 의미를 만들어 안심하고 데,이 작업을 수행 :

mtx <- matrix(NA, nrow=length(unique(df$x)), ncol=length(unique(df$y))) 
mtx[cbind(order(df$x), order(df$y))] <- df$z 

당신은 x와 y 거리에 대한 정보를 잃게됩니다 . 원하는 경우 주문 된 고유 값을 모체 dimnames에 추가 할 수 있습니다.

dimnames(mtx) <- list(sort(unique(df$x)), sort(unique(df$y))) 

지금은 적당히 일정한 간격으로 보이기 때문에 모든 것이 손실되지는 않습니다. 당신은 "독특한"값이 무엇인지 그 측정 오차가 결정되기 전에 작업을 반올림의 일종이 필요 찾을 수 :

> diff(df$x) 
[1] 0.07263300 0.07266708 0.07270105 0.07273493 0.07276870 0.07280237 0.07283593 0.07286939 
[9] 0.07290274 0.07293599 0.07296913 0.07300217 0.07303509 0.07306792 0.07310063 
> diff(df$y) 
[1] 0.01108424 0.01104067 0.01099707 0.01095343 0.01090976 0.01086606 0.01082233 0.01077856 
[9] 0.01073477 0.01069093 0.01064707 0.01060318 0.01055925 0.01051529 0.01047131 

간격 거리의 체계적인 증가/크리프가있는 것 같습니다 :

> diff(diff(df$x)) 
[1] 3.4080e-05 3.3977e-05 3.3874e-05 3.3772e-05 3.3668e-05 3.3562e-05 3.3459e-05 3.3354e-05 
[9] 3.3247e-05 3.3143e-05 3.3035e-05 3.2929e-05 3.2821e-05 3.2715e-05 
> diff(diff(df$y)) 
[1] -4.357e-05 -4.360e-05 -4.364e-05 -4.367e-05 -4.370e-05 -4.373e-05 -4.377e-05 -4.379e-05 
[9] -4.384e-05 -4.386e-05 -4.389e-05 -4.393e-05 -4.396e-05 -4.398e-05 
0

데이터 세트가 너무 크지 않고 LAT 및 LON 변수가 정수인 경우 행렬에 for 루프를로드하려고 할 수 있습니다. 100k 요소에서도 완료하는 데 1 분 이상 소요되지 않습니다.

n = max(df$LON) 
m = max(df$LAT) 
x = matrix(0, nrow=m, ncol=n) 
for (i in nrows(df)){ 
    x[df[i,"LAT"], df[i,"LON"]] = df[i,"VALUE"] 
} 
+0

거기에 몇 가지 문제가 있습니다. (1) LAT/LON이 정수가 아닌 경우 문제가됩니다. (2)이 예제에서는 다른 가능성보다 훨씬 느립니다. –

+0

"subscript out of bounds"오류가 발생합니다. – Nav

+0

네거티브 또는 LAT가 아닌 정수 나 LAT가 있으면 인덱스 범위에 매핑해야합니다. 결과를 100x100 매트릭스에 저장하려고한다고 가정 해 보겠습니다. LAT를 0에서 360 사이의 범위에서 1에서 100 범위로 변환하는 함수를 작성해야합니다.그런 다음 위의 코드를 다음과 같이 사용할 수 있습니다. x [lat2ind (df [i, "LAT"]), lon2ind (df [i, "LON"])] = df [i, "VALUE"] – kith