r - 测量每天第一个和最后一个位置记录与 R 中动物之间的距离

标签 r date dataframe location distance

我有一个数据库,其中包含超过 300,000 条动物观察记录。每行代表一个动物位置。每只动物都有一个唯一的 id ( id1 ) 和几列与该动物位置相关的属性,包括观察日期和 x 和 y 坐标。

有人可以帮我创建一个代码,让我可以执行以下操作:

1) BOTH date 的子集数据和 id1
2) 测量每个 date 的第一个和最后一个位置记录之间的距离(坐标以 UTM 为单位,因此距离以米为单位)每个不同的 id1
数据示例如下:

mydata<-read.table(text = 
"id1 date x y
1 11/02/2014 478776.4332 7922167.59 
1 11/02/2014 478776.4333 7922170.59
1 11/02/2014 478776.4334 7922180.59
1 12/02/2014 478776.4335 7922190.59 
1 12/02/2014 478776.4350 7922192.59
1 12/02/2014 478776.4360 7922195.59
2 11/02/2014 478776.4338 7922167.59
2 11/02/2014 478776.4339 7922183.59
2 11/02/2014 478776.4340 7922185.59
2 12/02/2014 478776.4350 7922188.30 
2 12/02/2014 478776.4360 7922190.59
2 12/02/2014 478776.4390 7922198.59
3 11/02/2014 478776.4338 7922167.59
3 11/02/2014 478776.4345 7922175.59
3 11/02/2014 478776.4355 7922178.85
3 12/02/2014 478776.4368 7922180.59 
3 12/02/2014 478776.4398 7922183.59
3 12/02/2014 478776.4399 7922185.59
4 11/02/2014 478776.4338 7922167.59
4 11/02/2014 478776.4340 7922172.59
4 11/02/2014 478776.4345 7922178.59
3 11/02/2014 478776.4350 7922179.59
3 12/02/2014 478776.4355 7922184.59 
3 12/02/2014 478776.4360 7922187.59
3 12/02/2014 478776.4365 7922198.59",
header = TRUE)

一个效率低得多的替代方法是为每个 date 选择第一条和最后一条记录。和 id1然后测量所有点对之间的距离。我找到了一个代码来为每只动物选择最后一条记录,但我仍然必须按日期合并子集:
myid.uni <- unique(mydata$id1)
a<-length(myid.uni)

last <- c()

for (i in 1:a) {
  temp<-subset(mydata, id1==myid.uni[i])
  if (dim(temp)[1] > 1) {
    last.temp<-temp[dim(temp)[1],]
  }
  else {
    last.temp<-temp
  }
  last<-rbind(last, last.temp)
}

有人可以帮助我使用任何一种策略,优先使用最直接的方法来做到这一点吗?

谢谢!

最佳答案

使用 dplyr:

library(dplyr)
mydata %>%
  group_by(id1, date) %>%
  summarize(x1 = first(x), y1 = first(y), x2 = last(x), y2 = last(y)) %>%
  mutate(distance = sqrt((x2-x1)^2+(y2-y1)^2))

结果:
Source: local data frame [7 x 7]
Groups: id1 [4]

    id1       date       x1      y1       x2      y2  distance
  (int)     (fctr)    (dbl)   (dbl)    (dbl)   (dbl)     (dbl)
1     1 11/02/2014 478776.4 7922168 478776.4 7922181 13.000000
2     1 12/02/2014 478776.4 7922191 478776.4 7922196  5.000001
3     2 11/02/2014 478776.4 7922168 478776.4 7922186 18.000000
4     2 12/02/2014 478776.4 7922188 478776.4 7922199 10.290001
5     3 11/02/2014 478776.4 7922168 478776.4 7922180 12.000000
6     3 12/02/2014 478776.4 7922181 478776.4 7922199 18.000000
7     4 11/02/2014 478776.4 7922168 478776.4 7922179 11.000000

关于r - 测量每天第一个和最后一个位置记录与 R 中动物之间的距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37415709/

相关文章:

r - 让 facet_grid 中的每个图都有自己的 Y 轴值

r - 使用 RMarkdown 内联结果(测试、描述等)

python - 向 Pandas Dataframe 对象添加样式后,如何将其保存为 PDF?

python - 在 header python pandas 中搜索部分字符串

date - gnuplot 叠加同一时间不同日期的图?

python - Pandas有没有相当于Stata fillin的函数?

r - 使用 ggplot2 : Create faceted scatterplot with scaled and moved density

r - 在 R 中生成 3 个总和为 1 的随机数

java.util.Calendar.setTime 处的 java.lang.NullPointerException

java - 无法添加逻辑来对 Java/android 中现有比较器中的日期进行排序