2013-03-04 5 views
3

У меня есть большой фрейм данных (100 000 строк) с LON, LAT, VALUE, который я хочу преобразовать в матрицу. (координаты в EPSG: 3035).пространственные данные xyz к матрице

Я попробовал reshape2 пакет с помощью следующей команды

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

, который работал великолепно.

Когда я преобразовал координаты в '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 <- data.frame (lon = sample (10:20), lat = sample (10:20), value = 10: 20)' –

+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 

Вы потеряете какую-либо информацию о х и у расстояния , При желании можно добавить упорядоченные уникальные значения в матричные 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. Даже при 100 тыс. Элементов для завершения не требуется больше минуты.

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

для этого примера. Я получаю ошибку «индекс за пределами границ». – Nav

+0

Если у вас есть негативы или не целочисленные LAT и LON, вам нужно будет сопоставить их с диапазоном индексов. Допустим, вы хотите сохранить результаты в матрице 100x100. Вам нужно будет написать функцию, которая преобразует LAT из диапазона, скажем от 0 до 360, в диапазон от 1 до 100.Затем вы можете использовать приведенный выше код, например: x [lat2ind (df [i, "LAT"]), lon2ind (df [i, "LON"])] = df [i, "VALUE"] – kith

Смежные вопросы