2016-07-15 5 views
2

У меня есть база данных, которая выглядит следующим образом:реорганизовать базу данных путем объединения строк из переменной

userId   SessionId  Screen   Platform  Version 
01    1    first   IOS   1.0.1 
01    1    main   IOS   1.0.1 
01    2    first   IOS   1.0.1 
01    3    first   IOS   1.0.1 
01    3    main   IOS   1.0.1 
01    3    detail   IOS   1.0.1 
02    1    first   Android  1.0.2 

В основном то, что я собираюсь сделать, это определить, является ли «путь» (разные экраны) приводит к лучше удерживать или нет. Я хотел бы реорганизовать каждый сеанс в одном столбце. Идеальная база данных будет выглядеть следующим образом:

userId  SessionId  Path     Retention 
01   1    first;main   3 
01   2    first    3 
01   3    first;main;detail 3 
02   1    first    1 

Здесь переменная Retention будет равна максимальной SessionId.

ответ

1

Возможное решение в базовом R:

d2 <- aggregate(Screen ~ userId + SessionId, d, toString) 
transform(d2, retention = ave(Screen, userId, FUN = length)) 

который дает:

> d2 
    userId SessionId    Screen retention 
1  01   1   first, main   3 
2  02   1    first   1 
3  01   2    first   3 
4  01   3 first, main, detail   3 

Альтернативным использованием dplyr:

library(dplyr) 
d %>% 
    group_by(userId, SessionId) %>% 
    summarise(Screen = toString(Screen)) %>% 
    group_by(userId) %>% 
    mutate(retention = n()) 

который дает:

userId SessionId    Screen retention 
    <chr>  <int>    <chr>  <int> 
1  01   1   first, main   3 
2  01   2    first   3 
3  01   3 first, main, detail   3 
4  02   1    first   1 
0

У меня есть data.table Solution

library(data.table) 
dt <- as.data.table(d) 
dt[, Retention := max(SessionId), by = .(userId)] 
dt[, .(Screen = paste(Screen, collapse = ";"), Retention = unique(Retention)), by = .(userId, SessionId)] 

userId SessionId   Screen Retention 
1:  01   1  first;main   3 
2:  01   2    first   3 
3:  01   3 first;main;detail   3 
4:  02   1    first   1 
+0

более чистой альтернативы (по крайней мере, IMO): 'DT [, удержание [, (Экран = ToString (экран)), от = (идентификатор пользователя, SessionId)..]: = .N, by = userId] [] ' – Jaap

+0

Я предполагал, что точки с запятой важны и что могут отсутствовать sessionIds. –