2017-01-03 7 views
0

У меня есть следующий вид данных:R Как найти пробелы в данных и классификации, если пробелы в большой

all_exercises <- c(1,2,9,4,5,7,6,8,3) 

user_id <- c(14,14,14,14,14,16,16,16,16,16) 
exercise_id <- c(1,2,9,4,5,1,2,4,5,6) 
df <- data.frame(user_id,exercise_id) 

df 

     user_id exercise_id 
1  14   1 
2  14   2 
3  14   9 
4  14   4 
5  14   5 
6  16   1 
7  16   2 
8  16   4 
9  16   5 
10  16   6 

Теперь я заинтересован в поиске пользователя, который не брал 3 для всех упражнений подряд. Порядок упражнений несколько отличается от 1: 9, и если у пользователя есть разрыв между ними, он также должен быть рассмотрен. В моем примере пользователь 14 выпал из-за того, что он не выполнял упражнения 7,6,8,3. Пользователь 16 не упал, потому что зазоры упражнений находятся на макс 2.

+2

Вы ищете 'diff' – Sotos

ответ

0

решение

df.gaps <- df %>% 
    mutate(exercise_id = factor(exercise_id, all_exercises)) %>% 
    arrange(user_id, exercise_id) %>% 
    mutate(exercise_id_num = as.numeric(exercise_id)) %>% 
    group_by(user_id) %>% 
    mutate(gap = lead(exercise_id_num) - exercise_id_num - 1) 
    mutate(gap = ifelse(is.na(gap), nlevels(all_exercises)-exercise_id_num, no=gap)) 


df.gaps 
    user_id exercise_id exercise_id_num gap 
    <dbl>  <fctr>   <dbl> <dbl> 
1  14   1    1  0 
2  14   2    2  0 
3  14   9    3  0 
4  14   4    4  0 
5  14   5    5  4 
6  16   1    1  0 
7  16   2    2  1 
8  16   4    4  0 
9  16   5    5  1 
10  16   6    7  2 
1

Вот решение с dplyr, но это, вероятно, дубликат ...

library(dplyr) 

df.gaps <- df %>% 
    arrange(user_id, exercise_id) %>% 
    group_by(user_id) %>% 
    mutate(gap = exercise_id - lag(exercise_id, default = 0)) 

df.gaps %>% 
    filter(gap > 3) 

df.gaps заказы данные по user_id и exercise_id (предполагает, что упражнения идут в порядке). Затем мы создаем group_byuser_id, чтобы создать разницу оконных функций (см. this window functions vignette). Я также установил значение по умолчанию для нуля, чтобы не приводить к NA.

И, наконец, вы можете отфильтровать этот новый файл данных df.gaps, чтобы получить результат.


Раствор база R может выглядеть примерно так:

df <- df[order(df$user_id, df$exercise_id), ] 
temp <- by(df$exercise_id, df$user_id, function(x) diff(x) > 3) 
sapply(temp, any) 
+0

спасибо за Ваш ответ! так как упражнения не упорядочены численно, я должен сделать промежуточный шаг и отсортировать его по всем упражнениям. df.gaps <- df %>% мутирует (exercise_id = коэффициент (exercise_id, all_exercises))%>% устраивает (идентификатор_пользователь, exercise_id)%>% мутирует (exercise_id = as.integer (exercise_id))%>% group_by (user_id)%>% mutate (gap = exercise_id - lag (exercise_id, default = 0)) – ThommyH

+0

Однако я не получаю пробелы в конце. Например. пользователь 14 не работал над последними 4 упражнениями, но поскольку нет записи, нет ничего, чтобы задерживать() с – ThommyH

+0

gap = lead (exercise_id) - exercise_id - это решение здесь – ThommyH