Выбор конкретных строк в R - PullRequest
1 голос
/ 18 октября 2011

Я сейчас работаю с данными GPS, положение животного собиралось, если возможно, каждые 4 часа. Данные выглядят так (данные XY здесь не показаны по некоторым причинам):

  ID  TIME           POSIXTIME  date_only
1   1 12:00 2005-05-08 12:00:00 2005-05-08
2   2 16:01 2005-05-08 16:01:00 2005-05-08
3   3 20:01 2005-05-08 20:01:00 2005-05-08
4   4  0:01 2005-05-09 00:01:00 2005-05-09
5   5  8:01 2005-05-09 08:01:00 2005-05-09
6   6 12:01 2005-05-09 12:01:00 2005-05-09
7   7 16:02 2005-05-09 16:02:00 2005-05-09
8   8 20:02 2005-05-09 20:02:00 2005-05-09
9   9  0:01 2005-05-10 00:01:00 2005-05-10
10 10  4:00 2005-05-10 04:00:00 2005-05-10

Я бы хотел брать только первые места в день. В большинстве случаев это будет в 0:01. Однако иногда это будет 4:01 или даже позже, поскольку отсутствуют данные. Как я могу получить только первые местоположения в день? Они должны быть включены в новый фрейм данных. Я попробовал это с:

tapply(as.numeric(Kandularaw$TIME),list(Kandularaw$date_only),min, na.rm=T)

Однако это не сработало, так как R принимает странные значения, когда ВРЕМЯ установлено в числовое значение. Можно ли сделать это с помощью ifelse? Если да, то как это будет выглядеть примерно? Я благодарен за каждую помощь, которую я могу получить. Спасибо за ваши усилия.

Приветствия

Jan

Ответы [ 2 ]

1 голос
/ 18 октября 2011

Я бы подошел к этому с более простой точки зрения.Во-первых, убедитесь, что POSIXTIME является одним из "POSIX" классов.Затем упорядочите данные по POSIXTIME.На этом этапе мы можем использовать любые идиомы split-apply-Объединить, чтобы делать то, что вы хотите, используя функцию head().Здесь я использую aggregate():

Используя этот пример набора данных:

dat <- structure(list(ID = 1:10, TIME = structure(c(4L, 6L, 8L, 1L, 
3L, 5L, 7L, 9L, 1L, 2L), .Label = c("00:01:00", "04:00:00", "08:01:00", 
"12:00:00", "12:01:00", "16:01:00", "16:02:00", "20:01:00", "20:02:00"
), class = "factor"), POSIXTIME = structure(1:10, .Label = c("2005/05/08 12:00:00", 
"2005/05/08 16:01:00", "2005/05/08 20:01:00", "2005/05/09 00:01:00", 
"2005/05/09 08:01:00", "2005/05/09 12:01:00", "2005/05/09 16:02:00", 
"2005/05/09 20:02:00", "2005/05/10 00:01:00", "2005/05/10 04:00:00"
), class = "factor"), date_only = structure(c(1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 3L, 3L), .Label = c("2005/05/08", "2005/05/09", 
"2005/05/10"), class = "factor")), .Names = c("ID", "TIME", "POSIXTIME", 
"date_only"), class = "data.frame", row.names = c(NA, 10L))

Сначала получите POSIXTIME и date_only в правильных форматах:

dat <- transform(dat,
                 POSIXTIME = as.POSIXct(POSIXTIME, format = "%Y/%m/%d %H:%M:%S"),
                 date_only = as.Date(date_only, format = "%Y/%m/%d"))

Далее, порядок по POSIXTIME:

dato <- with(dat, dat[order(POSIXTIME), ])

Последний шаг - использовать aggregate() для разделения данных на date_only и head() для выбора первой строки:

aggregate(dato[,1:3], by = list(date = dato$`date_only`), FUN = head, n = 1)

обратите внимание: я передаю n аргумент head(), значение 1, указывающее, что он должен извлекать только первую строку наблюдений каждого дня.Поскольку мы отсортировали по дате и времени по дате, первая строка должна быть первым наблюдением за день.Однако следует помнить о проблемах округления.

Последний шаг приводит к следующему:

> aggregate(dato[,1:3], by = list(date = dato$`date_only`), FUN = head, n = 1)
        date ID     TIME           POSIXTIME
1 2005-05-08  1 12:00:00 2005-05-08 12:00:00
2 2005-05-09  4 00:01:00 2005-05-09 00:01:00
3 2005-05-10  9 00:01:00 2005-05-10 00:01:00

Вместо dato[,1:3] обратитесь к тем столбцам в исходном наборе данных, которые содержат переменные (местоположения?)ты хотел.

1 голос
/ 18 октября 2011

Я предполагаю, что вы действительно хотите номер строки в качестве индекса в записи позиции.Если вы знаете, что эти строки упорядочены по дате и времени, и вы получаете удовлетворительные разбиения группы с этим вторым аргументом на tapply (как бы он ни был создан), попробуйте следующее:

idx <- tapply(1:NROW(Kandularaw), Kandularaw$date_only, "[", 1)

Если выхотите записи (строки) в том же кадре данных, затем просто используйте:

Kandularaw[ idx, ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...