选择R中的特定行

时间:2011-10-17 20:40:34

标签: r dataframe

我正在研究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声明吗?如果是的话,它会如何粗略看起来? 我很感激能得到的每一个帮助。谢谢你的努力。

干杯,

2 个答案:

答案 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))

首先,以正确的格式获取POSIXTIMEdate_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]引用原始数据集中的任何列包含您想要的变量(位置?)。

相关问题