могу ли я решить эту проблему с помощью al oop и как? - PullRequest
1 голос
/ 28 мая 2020

У меня есть большой набор экологических данных, который включает идентификаторы развертывания, которые необходимо исправить.

Фотоловушки были развернуты в течение десятилетнего периода, и расположение фотоловушек записано как идентификатор развертывания. Однако фотоловушки могли быть установлены в одном и том же месте дважды в разное время. В этом случае идентификатор развертывания был записан как один и тот же, но он должен быть уникальным.

И для пояснения: только одна камера-ловушка может быть развернута в одном месте за раз. Но за десять лет в некоторых местах было несколько фотоловушек.

Итак, моя цель - сделать их уникальными идентификаторами развертывания.

Моя попытка: я знаю, что ловушки для камеры не устанавливались дольше 3 месяцев. Итак, используя DateTime, если прошло более 100 дней, я могу предположить, что это повторное развертывание, и я хочу назначить ему уникальный идентификатор развертывания. Итак, я создал столбец с DateDiff

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')
    }
}

Затем я подумал, что если я закажу данные сначала по идентификатору развертывания, а затем по DateTime ...

data[order(data$deploymentID, data$DateTime), ]

, я буду возможность использовать al oop, который проходит через фрейм данных, и если DateDiff> 100, все следующие строки, где идентификатор развертывания одинаковый, создают уникальный идентификатор развертывания.

Однако я изо всех сил пытаюсь создать рабочий l oop за этот последний раздел!

I've attached a picture to show the structure of my data

Большое спасибо

1 Ответ

1 голос
/ 28 мая 2020

Вот решение с dplyr. Сначала сгруппируйте по ID и назначьте даты. Затем вы можете рассчитать разницу дат с помощью функции lag. После этого вы вычисляете с помощью cumsum, как часто развертывание отличается более чем на 100 дней, и используете это для создания уникального идентификатора:

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
...