2013-09-27 5 views
2

Предположим, у меня есть следующие SpatialPointsDataFrameИспользование применяются Spatial * DataFrame

library(sp) 
exdf <- data.frame(cbind(1:10, 41:50, 101:110)) 
names(exdf) <- c("id", "x", "y") 
coordinates(exdf) <- c("x", "y") 

можно запустить следующие apply

apply([email protected], 1, function(x) { 
         cat(coordinates(exdf[exdf$id == x["id"],]), "\n") 
           }) 

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

Обратите внимание, что в моем фактическом использовании, мне нужно отправить как строки кадра данных и координат в другую функцию, так apply ИНГ только на [email protected] не вариант.

Вопрос 1: Есть ли способ сделать это без exdf[exdf$id == x["id"],]?

Вопрос 2: Если нет, есть ли пакет, который я могу использовать вместо sp для выполнения таких задач. Мне нужен sp для его функции over в основном, и также проверил также spatstat и решил, что sp прост в использовании. Однако использование «кадра данных», которое на самом деле не является data.frame, меня раздражает.

спасибо.

+0

Что вы на самом деле хотите сделать? Как называется эта другая функция? –

+0

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

+0

Я отредактировал свой ответ, но должен признать, что вы не совсем поняли, каков ваш желаемый конечный результат и какие ограничения применяются. – chryss

ответ

1

Вы можете легко превратить ваш SpatialPointsDataFrame в обычный data.frame, а затем перейти оттуда:

> df <- as.data.frame(exdf) 
> df 
    id x y 
1 1 41 101 
2 2 42 102 
3 3 43 103 
4 4 44 104 
5 5 45 105 
6 6 46 106 
7 7 47 107 
8 8 48 108 
9 9 49 109 
10 10 50 110 
> paste(df$x, df$y, sep=' ') 
[1] "41 101" "42 102" "43 103" "44 104" "45 105" "46 106" "47 107" "48 108" "49 109" "50 110" 

Edit: Из комментария, ОП хотел бы достичь результата в более простых способов, но без преобразования Spatial * DataFrame в data.frame. Тот же результат, как и в его примере можно достичь с помощью следующего кода, но он должен быть изменен, если дополнительные столбцы будут также напечатаны/сцепленных/обрабатываются:

cat(paste([email protected][,1], [email protected][,2]), sep='\n') 
+0

Я согласен, что это более элегантно, но отличается от, скажем, 'lapply (seq (to = nrow (exdf), function (i) {el <- exdf [i,]})' performance wise? У меня есть большой кадр данных, и я не люблю конвертировать туда и обратно между его пространственным эквивалентом. Я мог бы также хранить дополнительные столбцы для 'x' и' y', но тогда я мог бы просто написать функцию, которая находит строки внутри прямоугольника.) –

+0

Ну, это полезно, чтобы быть ясным в вашей постановке проблемы. Вы не сказали, что вас беспокоит производительность - это казалось вашим интересом в читабельности. Кроме того, оптимизация производительности или памяти для набора данных из 10 баллов была бы безумной - если размер вашего набора данных имеет значение, хорошо сказать об этом в вопросе. Я еще раз подумаю. – chryss

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