2017-01-03 53 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不被user_id下降,因爲演習的差距是在最大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訂單數據和exercise_id(假設練習按順序進行)。然後,我們group_byuser_id爲了創建一個窗口函數的差異(見this window functions vignette) - 我也設置了一個默認值零不會導致NA

最後,你可以過濾這個新的df.gaps data.frame來得到你的結果。


一個基地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

感謝您的回答!由於練習不是按照數字順序排列的,我必須進入中間步驟並按all_exercises排序。 df.gaps <- df %>% 發生變異(exercise_id =因子(exercise_id,all_exercises))%>% 安排(USER_ID,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