как и проблема, но требует вывода данных из фрейма - R - PullRequest
1 голос
/ 19 января 2012

Это мой первый пост, так что, надеюсь, я объясню, что мне нужно сделать правильно. Я все еще новичок в R, и, возможно, я читал посты, которые отвечают на это, но я просто не могу понять, что они значат. Поэтому заранее извиняюсь, если на этот вопрос уже был дан ответ.

У меня очень большой набор данных о местоположениях GPS с радиоколлар, и для каждого дня есть непоследовательное количество местоположений. Я хочу пройти через набор данных и выбрать одну точку данных для каждого дня на основе уровня точности сигнала GPS.

Так что, по сути, это выглядит так.

Accuracy    Month    Day    Easting    Northing    Etc
   5          6       1     #######    ########     #
   3.2        6       1     #######    ########     #
   3.8        6       1     #######    ########     #
   1.6        6       2     #######    ########     #
   4          6       3     #######    ########     #
   3.2        6       3     #######    ########     #

И я хочу вытащить самую точную точку для каждого дня (самую низкую меру точности), сохраняя при этом остальные связанные данные.

В настоящее время я использую функцию tapply

datasub1<-subset(data,MONTH==6)
tapply(datasub1$accuracy, datasub1$day, min)

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

Так что, по сути, мне нужно получить те же результаты, что и у точки, но вместо отдельных точек мне нужна вся строка, в которой находится эта точка.

Заранее спасибо всем, кто мог бы протянуть руку. Если вам нужна дополнительная информация, дайте мне знать, я сделаю все возможное, чтобы донести ее до вас.

Ответы [ 3 ]

6 голосов
/ 19 января 2012

Вы можете использовать ddply: он разбивает data.frame на части (по одному в день) и применяет функцию к каждому фрагменту.

# Sample data
n <- 100
d <- data.frame(
  Accuracy = round(runif(n, 0, 5), 1),
  Month    = sample(1:2, n, replace=TRUE),
  Day      = sample(1:5, n, replace=TRUE),
  Easting  = rnorm(n),
  Northing = rnorm(n),
  Etc      = rnorm(n)
)

# Extract the maximum for each day
# (In case of ties, you only have the first row)
library(plyr)
ddply( 
  d, 
  c("Month", "Day"), 
  function (u) u[ which.min(u$Accuracy), ] 
)
2 голосов
/ 19 января 2012

То есть вы вообще не хотите никоим образом агрегировать. Все, что вам нужно сделать, это выбрать минимум для каждого дня. Итак, все, что вам нужно сделать, это найти минимумы и выбрать совпадения.

mins <- ave(datasub1$accuracy, datasub1$day, FUN = min)
datasub1[ datasub1$accuracy == mins, ]

Если вам нужен день за месяцем или годом или чем-то еще, просто добавьте их в виде списка ко второму аргументу ave. Вот альтернативный синтаксис.

mins <- with( datasub1, ave(accuracy, day, month, FUN = min) )
2 голосов
/ 19 января 2012

Это одно базовое решение, использующее парадигму split-apply, которая сформировала основу для функций plyr, по крайней мере, в начале:

lapply( 
     split(dat, list(dat$Month, dat$Day)),
         function(d) d[ which.min(d$Accuracy), ])
...