我想在R中的数据帧中提取每个组中的第一行和最后一行数据。我有一长串数据(约300,000个观测值),其中有数千个组。对于每个组,我需要第一个和最后一个观测值(在这种情况下,我要提取数千个测量样点的第一个和最后一个纬度/经度)。
我想出了一个可行的for循环解决方案:我一次将数据分组为一组,但是想看看是否有更干净的方法来解决此问题:
library(tidyverse)
#example survey data along CA coastline
example.data = data.frame(group = c(rep('A',20),rep('B',20),rep('C',20)),
latitude = seq(32,38, length.out = 60), #N samples, mean, sd
longtitude = seq(-119,-122,length.out = 60))
head(example.data)
这看起来像:
group latitude longtitude
A 32.00000 -119.0000
A 32.10169 -119.0508
A 32.20339 -119.1017
A 32.30508 -119.1525
A 32.40678 -119.2034
这是我使用for循环的解决方案:
#find groups (i.e. transects)
letter.levels = levels(example.data$group)
first_last = c()
for(i in 1:length(letter.levels)){
d = filter(example.data, group == letter.levels[i])
d.len = length(d[,1])
first = d[1,]
last = d[d.len,]
first_last = rbind(first,last,first_last)
}
#view results
first_last
我要寻找的最终结果是(每个测量样线的开始/停止位置):
group latitude longtitude
C 36.0678 -121.0339
C 38.0000 -122.0000
B 34.0339 -120.0169
B 35.9661 -120.9831
A 32.0000 -119.0000
A 33.9322 -119.9661
请问我有没有更干净的dplyr版本?如果没有其他问题,我总是可以退回到这个for循环版本。
我搜索了帮助,发现: somewhat related question和 another(but different) for-loop suggestion