Как вы проверяете порядок набора действий, учитывая ранги для каждого из них? - PullRequest
0 голосов
/ 28 марта 2019

У меня есть этот фрейм данных.

user    action    date        rank
AAA     jump      2018-01-01  1
AAA     climb     2018-01-02  2
AAA     leap      2018-01-03  3
BBB     jump      2018-01-01  1
BBB     climb     2018-01-03  2
BBB     leap      2018-01-05  3
BBB     gallop    2018-01-08  4
CCC     leap      2018-01-01  1
CCC     climb     2018-01-02  2
CCC     gallop    2018-01-04  3

Он выполняет действия и добавляет рейтинг для пользователя в соответствии с датой в порядке возрастания.

Я хочу найти всех пользователей, которые принялидействия в неправильном порядке.Заказ должен быть jump -> climb -> leap -> gallop.

Вывод будет CCC, так как этот пользователь совершил прыжок перед подъемом.

user   
CCC

Как сделать ссылку на определенную строку?Я использую dplyr, и я могу сгруппировать его по каждому пользователю и добавить ранг для каждого пользователя с row_number(), но я не знаю, как создавать правила, которые проверяют, происходят ли действия в правильном порядке.

Примечание. Я понял, что это неясно.Не каждый пользователь выполняет все действия, но порядок все еще имеет значение.

Это то, что я работаю до сих пор

badData <- NULL
for (i in df$user){
  filtered <- filter(df, user == i)

  first <- ifelse(filtered[filtered$action == "jump",]$rank > 1, TRUE, FALSE)
  second <- ifelse(filtered[filtered$action == "climb",]$rank < filtered[filtered$action == "jump",]$rank, TRUE, FALSE)
  #and so on for the rest of the rules

  if(first + second > 0) badData <- c(badData, i)   
}

Ответы [ 2 ]

2 голосов
/ 28 марта 2019

Если вы установите action фактор и используете аргумент levels, чтобы установить порядок, вы можете сгруппировать по пользователю, а затем проверить, не отсортированы ли действия, используя is.unsorted:

library(dplyr)

df %>%
  mutate(action = factor(action, levels = c("jump", "climb", "leap", "gallop"))) %>%
  group_by(user) %>%
  filter(is.unsorted(action)) %>%
  pull(user) %>%
  unique

[1] "CCC"
1 голос
/ 28 марта 2019

Вот небольшой пример, которого вы можете достичь. Сначала вы создаете фрейм данных refrence (refdata), который содержит правильный порядок. Тогда вы можете легко работать с пакетом tidyverse:

mydata <- tibble(id = rep(c("aaa", "bbb", "ccc"), each = 4), action = letters[c(1:4, 1,2 ,4, 3, 4,1,2,3)],
       date = rep(1:3, 4)) 

refdata <- tibble(action = letters[1:4], right_order = 1:4)


mydata %>% left_join(refdata, by = "action") %>% group_by(id) %>% 
  summarise(test = identical(right_order, sort(right_order)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...