Функция R для определения, отличается ли строка во временном ряду от предыдущего, и извлечение обеих строк из списка - PullRequest
2 голосов
/ 24 марта 2020

У меня есть список из 14 отдельных организмов из набора данных телеметрии, отслеживающих их движения. Я заинтересован в том, чтобы выяснить, пересекли ли они несколько определенных c барьеров в любой точке в течение периода мониторинга. Эти 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 человек в списке. Все они могут быть добавлены к одному и тому же фрейму данных или находиться в отдельном списке.

Я пытался использовать для l oop с операторами ifelse, но он ничего не возвращает.

Спасибо!

Ответы [ 3 ]

1 голос
/ 24 марта 2020

Это то, чего вы хотите достичь:

 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(...) сравнивает каждое местоположение с его предшественником и сохраняет только те строки, где есть разница.

1 голос
/ 24 марта 2020

Предполагая, что с тидиверсом у вас все в порядке, и предполагая, что ваш фрейм данных называется df:

library(tidyverse)

df %>%
  group_by(Individual) %>% 
  filter((Location != lag(Location)) | Location != lead(Location))

Вы можете пропустить строку group_by, если в вашем наборе данных только один человек .

0 голосов
/ 24 марта 2020

Один из способов - сравнить текущее местоположение со следующим (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)
...