Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 我可以用循环来解决这个问题吗?如何解决?_R_Loops_Dataframe - Fatal编程技术网

R 我可以用循环来解决这个问题吗?如何解决?

R 我可以用循环来解决这个问题吗?如何解决?,r,loops,dataframe,R,Loops,Dataframe,我有一个大型的生态数据集,其中包括需要修复的部署ID 摄像头陷阱的部署时间超过十年,摄像头陷阱的位置记录为部署ID。但是,摄像头陷阱可能在不同时间在同一位置部署了两次。在这种情况下,部署ID被记录为相同的,但它们必须是唯一的 澄清一下:一次只能在一个位置部署一个摄像头陷阱。但在十年的时间里,一些地点有多个摄像头陷阱 因此,我的目标是使它们成为唯一的部署ID 在我的尝试中:我知道相机陷阱的部署时间不超过3个月。因此,使用DateTime,如果超过100天,我可以假设这是一个重新部署,我想为它分配一

我有一个大型的生态数据集,其中包括需要修复的部署ID

摄像头陷阱的部署时间超过十年,摄像头陷阱的位置记录为部署ID。但是,摄像头陷阱可能在不同时间在同一位置部署了两次。在这种情况下,部署ID被记录为相同的,但它们必须是唯一的

澄清一下:一次只能在一个位置部署一个摄像头陷阱。但在十年的时间里,一些地点有多个摄像头陷阱

因此,我的目标是使它们成为唯一的部署ID

在我的尝试中:我知道相机陷阱的部署时间不超过3个月。因此,使用DateTime,如果超过100天,我可以假设这是一个重新部署,我想为它分配一个唯一的部署ID

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