Рассмотрим последовательное значение в данных - PullRequest
0 голосов
/ 24 октября 2019

У меня есть данные с 3 столбцами ID, время и тип;Мне нужно добавить столбец с именем «categoryroy», и пример данных с выходными данными приведен ниже:

> dput(DF1)
structure(list(ID = c("104 - 2019-06-03", "104 - 2019-06-03", 
"104 - 2019-06-03", "104 - 2019-06-03", "104 - 2019-06-03", "104 - 2019-06-03", 
"104 - 2019-06-03", "104 - 2019-06-03", "104 - 2019-06-03", "104 - 2019-06-03", 
"104 - 2019-06-03", "111 - 2019-05-31", "111 - 2019-05-31"), 
    Time = c("11:17:01", "12:48:51", "13:54:09", "14:14:46", 
    "14:19:46", "14:32:46", "14:19:27", "14:35:12", "15:30:22", 
    "15:31:22", "16:29:12", "09:31:53", "09:31:56"), Type = c("IN", 
    "Out", "IN", "IN", "IN", "IN", "Out", "Out", "IN", "IN", 
    "Out", "IN", "Out"), Category = c("Include", "Include", "Include", 
    "Exclude", "Exclude", "Exclude", "Exclude", "Include", "Include", 
    "Exclude", "Include", "Include", "Include")), row.names = c(NA, 
-13L), class = c("tbl_df", "tbl", "data.frame"))

Будучи данными свайпа, отсортированными по времени и идентификатору, необходимо учитывать, помечен ли человек как «IN ", а затем" Out "делает это единственной правильной записью. Я отмечаю как IN, так и OUT как «Включить», если это происходит последовательно. Иногда есть несколько последовательных входов и выходов, и в этих случаях я отмечаю первый «IN» как включающий, а «последний» OUT »как включающий. Промежуточные записи помечаются как исключающие. Спасибо!

1 Ответ

1 голос
/ 24 октября 2019

Как Саудик сказал вам в своем комментарии, основной проблемой вашего вопроса было понять вашу классификацию. Так как мне нравятся головоломки, вот моя попытка.

Как я понял, вы хотите чередовать In и Out для каждого идентификатора, отсортированного по времени.

Вот код, чтобы получитьКритерии включения:

library(chron)
library(dplyr)

x = read.table(text = "
ID  Type  Time
104-2019-06-03  In  11:17:01
104-2019-06-03  Out 12:48:51
104-2019-06-03  In  13:54:09
104-2019-06-03  In  14:14:46
104-2019-06-03  Out 14:19:27
104-2019-06-03  In  14:31:12
104-2019-06-03  Out 15:21:51
104-2019-06-03  In  15:30:22
104-2019-06-03  Out 16:29:12
104-2019-06-04  In  14:31:12
104-2019-06-04  Out 15:21:51
104-2019-06-04  Out 15:30:22
104-2019-06-04  Out 16:29:12
", header=T) %>% 
  mutate(Time = chron(time=Time))

# x[c(4,11,12),"Category"] = "Exclude"
# x$Category = x$Category %>% replace_na("Include")

x %>% 
  arrange(ID, Time) %>% 
  group_by(ID) %>% 
  mutate(
    Category = ifelse(Type=="In", Type!=lag(Type), Type!=lead(Type)),
    Category = ifelse(is.na(Category)|Category==TRUE, "Include", "Exclude")
  )

Ключом здесь является использование lag и lead для проверки того, имеет ли следующая / предыдущая строка одинаковое значение. Так как вы хотите последний или первый, это зависит от значения Type. Затем вы можете очистить столбец, переведя «Включить» или «Исключить».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...