gpt4 book ai didi

r - 如果位于唯一 ID 的开头或结尾,则过滤连续的相同值

转载 作者:行者123 更新时间:2023-12-05 05:47:08 24 4
gpt4 key购买 nike

我有一个数据集,其中包含从一个群体进行多次旅行的鸟类的 GPS 位置。我想删除距离殖民地 3 公里以内的所有点,但只有那些在个人旅行开始或结束时的点(Unique_id)。如果他们在旅途中来到了殖民地3公里以内,然后没有先返回殖民地就再次出发,我想保留这些积分。

我计算了到殖民地的距离,然后使用逻辑列定义该位置是 < 3 公里 (1) 还是 > 3 公里 (0)。删除坐标后,数据框看起来有点像下面的虚拟数据。因此,从这里开始,我希望按照“为 Unique_id 的第一个或最后一个连续“1”删除带有 dist3k == 1 的行来定义一些内容。

希望这是有道理的,并期待提出建议。

# what the data looks like 
data_orig <- data.frame(
Index = rep(c('1','2','3','4','5','6','7','8','9','10',
'11','12','13','14','15','16','17','18','19','20')),
Unique_id = rep(c('A1','A2'), each = 10),
dist3k = rep(c('1','1','0','0','0','1','1','0','0','1','1','1','1','0','1','0','1','0','1','1')))

# what I want the output to be
data_new <-data_orig[-c(1,2,10,11,12,13,19,20),]

最佳答案

这是使用 dplyrcumsum 的方法。

它的工作原理是反转二进制值 dist3k!=1,然后计算累积和 cumsum(dist3k!=1),它在开始时始终为零向量从 1 开始。

然后对最后一个值进行相同但相反的操作。

我们现在有两个向量 fil1fil2,我们可以在其中过滤寻找非零值。

library(dplyr)

data_orig %>%
group_by(Unique_id) %>%
mutate(fil1=cumsum(dist3k!=1), fil2=rev(cumsum(rev(dist3k)!=1))) %>%
filter(fil1!=0 & fil2!=0) %>%
ungroup() %>%
select(-starts_with("fil"))
# A tibble: 12 × 3
Index Unique_id dist3k
<chr> <chr> <chr>
1 3 A1 0
2 4 A1 0
3 5 A1 0
4 6 A1 1
5 7 A1 1
6 8 A1 0
7 9 A1 0
8 14 A2 0
9 15 A2 1
10 16 A2 0
11 17 A2 1
12 18 A2 0

关于r - 如果位于唯一 ID 的开头或结尾,则过滤连续的相同值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71056060/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com