我有一个来自遥测数据集的14个个体生物的列表,跟踪它们的运动。我有兴趣弄清楚他们是否在监控期间的任何时候都跨越了一些特定的障碍。这 14 个人目前存储在一个列表中,检测范围从 100 到 100,000 次不等。
数据集的示例如下:
Date Time Individual Location
2019-04-25 06:16:29 A69-1601-26907 DI 03
2019-04-25 06:23:31 A69-1601-26907 DI 03
2019-04-25 06:52:17 A69-1601-26907 BR 04
2019-04-25 07:41:31 A69-1601-26907 BR 04
2019-04-25 07:59:13 A69-1601-26907 BR 04
2019-04-25 08:16:19 A69-1601-26907 DI 03
2019-04-25 08:33:42 A69-1601-26907 DI 03
目标是提取位置已更改的两行。例如,BR 04 和它前面的那个(06:23:31 和 06:52:17 行),并将它们放在自己的数据帧中。然后还要提取 7:59:13 和 8:16:19 的行,因为它表示这个人再次越过障碍。为此个人的整个数据集执行此操作。最终获得该个人所有传输的数据帧。
然后对列表中的其他 13 个人再次执行相同的功能。它们可以全部追加到同一数据帧,也可以放在列表中。
我尝试将 for 循环与 ifelse 语句一起使用,但它不返回任何内容。
谢谢!
假设您可以使用整洁,并假设您的数据框被称为df
:
library(tidyverse)
df %>%
group_by(Individual) %>%
filter((Location != lag(Location)) | Location != lead(Location))
如果数据集中只有一个个人,则可以省略group_by
行。
这是你想要实现的吗:
library(tidyverse)
df = data.frame(
date = c("25.04.2019", "25.04.2019", "25.04.2019", "25.04.2019", "25.04.2019", "25.04.2019", "25.04.2019"),
time = c("06:16:29", "06:23:31", "06:52:17", "07:41:31", "07:59:13", "08:16:19", "08:33:42"),
location = c("DI 03", "DI 03", "BR 04", "BR 04", "BR 04", "DI 03", "DI 03")
)
df %>% filter(location != lag(location))
filter(...)
函数将每个位置与其前置位置进行比较,并仅保留存在差异的行。
一种方法是将当前位置与下一个位置(lead
)和上一个位置(lag
)进行比较,按个人分组,并查找两者中都不相同的记录。
library(dplyr)
df %>%
group_by(Individual) %>%
filter(Location!=lead(Location) | Location!=lag(Location))
# A tibble: 4 x 5
# Groups: Individual [1]
Date Individual Location
<chr> <chr> <chr>
1 2019-04-25 06:23:31 A69-1601-26907 DI 03
2 2019-04-25 06:52:17 A69-1601-26907 BR 04
3 2019-04-25 07:59:13 A69-1601-26907 BR 04
4 2019-04-25 08:16:19 A69-1601-26907 DI 03
这应返回一个数据框,其中包含所有更改位置的个人的记录。
数据
df <- read.table(text="Date Individual Location
'2019-04-25 06:16:29' A69-1601-26907 'DI 03'
'2019-04-25 06:23:31' A69-1601-26907 'DI 03'
'2019-04-25 06:52:17' A69-1601-26907 'BR 04'
'2019-04-25 07:41:31' A69-1601-26907 'BR 04'
'2019-04-25 07:59:13' A69-1601-26907 'BR 04'
'2019-04-25 08:16:19' A69-1601-26907 'DI 03'
'2019-04-25 08:33:42' A69-1601-26907 'DI 03'", header=TRUE, stringsAsFactors=FALSE)