R 我可以用循环来解决这个问题吗?如何解决?
我有一个大型的生态数据集,其中包括需要修复的部署ID 摄像头陷阱的部署时间超过十年,摄像头陷阱的位置记录为部署ID。但是,摄像头陷阱可能在不同时间在同一位置部署了两次。在这种情况下,部署ID被记录为相同的,但它们必须是唯一的 澄清一下:一次只能在一个位置部署一个摄像头陷阱。但在十年的时间里,一些地点有多个摄像头陷阱 因此,我的目标是使它们成为唯一的部署ID 在我的尝试中:我知道相机陷阱的部署时间不超过3个月。因此,使用DateTime,如果超过100天,我可以假设这是一个重新部署,我想为它分配一个唯一的部署IDR 我可以用循环来解决这个问题吗?如何解决?,r,loops,dataframe,R,Loops,Dataframe,我有一个大型的生态数据集,其中包括需要修复的部署ID 摄像头陷阱的部署时间超过十年,摄像头陷阱的位置记录为部署ID。但是,摄像头陷阱可能在不同时间在同一位置部署了两次。在这种情况下,部署ID被记录为相同的,但它们必须是唯一的 澄清一下:一次只能在一个位置部署一个摄像头陷阱。但在十年的时间里,一些地点有多个摄像头陷阱 因此,我的目标是使它们成为唯一的部署ID 在我的尝试中:我知道相机陷阱的部署时间不超过3个月。因此,使用DateTime,如果超过100天,我可以假设这是一个重新部署,我想为它分配一
for (i in 2:nrow(data)){
if (data$deploymentID[i] == data$deploymentID[i-1]){
data$DateDiff[i] <- as.Date(data$DateTime[i], format = '%Y%m%d') - as.Date(data$DateTime[i-1], format = '%Y%m%d')
}
}
我将能够使用一个贯穿数据帧的循环,如果DateDiff大于100,则在部署ID相同的所有后续行中,创建唯一的deploymentID
然而,我正在努力为最后一部分创建一个工作循环
非常感谢这里有一个使用
dplyr
的解决方案。首先按ID
分组并安排日期。然后,您可以使用lag
函数计算日期差。然后,使用cumsum
计算部署差异超过100天的频率,并使用此值生成唯一ID:
data <- data.frame(ID = c(rep("B1-2-41", 8), rep("B1-2-44", 8)),
date = c(rep(as.Date("2019-05-01"), 8),
rep(as.Date("2018-01-01"), 6),
as.Date("2018-05-01"), as.Date("2018-10-01")))
library(dplyr)
data_new <- data %>%
group_by(ID) %>%
arrange(date) %>%
mutate(date_diff = date - lag(date, default = first(date)),
unique_ID = paste0(ID, "_", cumsum(date_diff > 100) + 1)) %>%
ungroup() %>%
arrange(ID)
> data_new
# A tibble: 16 x 4
ID date date_diff unique_ID
<fct> <date> <drtn> <chr>
1 B1-2-41 2019-05-01 0 days B1-2-41_1
2 B1-2-41 2019-05-01 0 days B1-2-41_1
3 B1-2-41 2019-05-01 0 days B1-2-41_1
4 B1-2-41 2019-05-01 0 days B1-2-41_1
5 B1-2-41 2019-05-01 0 days B1-2-41_1
6 B1-2-41 2019-05-01 0 days B1-2-41_1
7 B1-2-41 2019-05-01 0 days B1-2-41_1
8 B1-2-41 2019-05-01 0 days B1-2-41_1
9 B1-2-44 2018-01-01 0 days B1-2-44_1
10 B1-2-44 2018-01-01 0 days B1-2-44_1
11 B1-2-44 2018-01-01 0 days B1-2-44_1
12 B1-2-44 2018-01-01 0 days B1-2-44_1
13 B1-2-44 2018-01-01 0 days B1-2-44_1
14 B1-2-44 2018-01-01 0 days B1-2-44_1
15 B1-2-44 2018-05-01 120 days B1-2-44_2
16 B1-2-44 2018-10-01 153 days B1-2-44_3
数据%
安排(日期)%>%
mutate(date_diff=date-lag(date,default=first(date)),
唯一ID=paste0(ID,“,”和(日期差异>100)+1))%>%
解组()%>%
安排(ID)
>新数据
#一个tibble:16 x 4
ID日期日期差异唯一ID
1 B1-2-41 2019-05-01 0天B1-2-41_1
2 B1-2-41 2019-05-01 0天B1-2-41_1
3 B1-2-41 2019-05-01 0天B1-2-41_1
4 B1-2-41 2019-05-01 0天B1-2-41_1
5 B1-2-41 2019-05-01 0天B1-2-41_1
6 B1-2-41 2019-05-01第0天B1-2-41_1
7 B1-2-41 2019-05-01 0天B1-2-41_1
8 B1-2-41 2019-05-01 0天B1-2-41_1
9 B1-2-44 2018-01-01 0天B1-2-44_1
10 B1-2-44 2018-01-01 0天B1-2-44_1
11 B1-2-44 2018-01-01 0天B1-2-44_1
12 B1-2-44 2018-01-01 0天B1-2-44_1
13 B1-2-44 2018-01-01 0天B1-2-44_1
14 B1-2-44 2018-01-01 0天B1-2-44_1
15 B1-2-44 2018-05-01 120天B1-2-442
16 B1-2-44 2018-10-01 153天B1-2-44_3
来自[r]标记信息:“请提供最小且可复制的示例以及所需的输出。对数据使用dput()
,并使用library()
调用指定所有非基本软件包。不要为数据或代码嵌入图片,而是使用缩进的代码块。”帮助其他人帮助您解决问题。通过将您的问题包含在R命令的输出中,以便于其他人在R会话中使用的方式提供您的数据dput(data)
非常感谢@starja!按功能分组将派上用场。
data <- data.frame(ID = c(rep("B1-2-41", 8), rep("B1-2-44", 8)),
date = c(rep(as.Date("2019-05-01"), 8),
rep(as.Date("2018-01-01"), 6),
as.Date("2018-05-01"), as.Date("2018-10-01")))
library(dplyr)
data_new <- data %>%
group_by(ID) %>%
arrange(date) %>%
mutate(date_diff = date - lag(date, default = first(date)),
unique_ID = paste0(ID, "_", cumsum(date_diff > 100) + 1)) %>%
ungroup() %>%
arrange(ID)
> data_new
# A tibble: 16 x 4
ID date date_diff unique_ID
<fct> <date> <drtn> <chr>
1 B1-2-41 2019-05-01 0 days B1-2-41_1
2 B1-2-41 2019-05-01 0 days B1-2-41_1
3 B1-2-41 2019-05-01 0 days B1-2-41_1
4 B1-2-41 2019-05-01 0 days B1-2-41_1
5 B1-2-41 2019-05-01 0 days B1-2-41_1
6 B1-2-41 2019-05-01 0 days B1-2-41_1
7 B1-2-41 2019-05-01 0 days B1-2-41_1
8 B1-2-41 2019-05-01 0 days B1-2-41_1
9 B1-2-44 2018-01-01 0 days B1-2-44_1
10 B1-2-44 2018-01-01 0 days B1-2-44_1
11 B1-2-44 2018-01-01 0 days B1-2-44_1
12 B1-2-44 2018-01-01 0 days B1-2-44_1
13 B1-2-44 2018-01-01 0 days B1-2-44_1
14 B1-2-44 2018-01-01 0 days B1-2-44_1
15 B1-2-44 2018-05-01 120 days B1-2-44_2
16 B1-2-44 2018-10-01 153 days B1-2-44_3