我正在研究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)
然而,当TIME设置为数字时,这不起作用,因为R取奇数值。 有可能用ifelse声明吗?如果是的话,它会如何粗略看起来? 我很感激能得到的每一个帮助。谢谢你的努力。
干杯,
扬
答案 0 :(得分:1)
我猜你真的想要一个行号作为位置记录的索引。如果您知道这些行按日期时间排序,并且您正在使用第二个参数tapply
获得令人满意的组拆分(但它已创建),请尝试以下操作:
idx <- tapply(1:NROW(Kandularaw), Kandularaw$date_only, "[", 1)
如果您想在同一数据帧中使用记录(行),请使用:
Kandularaw[ idx, ]
答案 1 :(得分:1)
我会从更简单的角度来看待这个问题。首先,确保POSIXTIME
是"POSIX"
类之一。然后按POSIXTIME
订购数据。在这一点上,我们可以使用任何split-apply-combine习语来做你想做的事情,利用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}}参数值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]
引用原始数据集中的任何列包含您想要的变量(位置?)。