2016-08-01 27 views
2

Ich versuche, eine Tabelle wie folgt zu konvertieren:Expanding Spalte basierend auf einer anderen Spalte der Gruppierung (dplyr/tidyr)

# A tibble: 10 x 2 
    user_id  pred 
    <int>  <fctr> 
1  27 electronics 
2  27  home 
3  38  health 
4  60 electronics 
5  60  beauty 
6  92  home 
7  92 electronics 
8  106  health 
9  117  home 
10  117  women 

zu einer, die wie folgt aussieht:

# A tibble: 6 x 3 
    user_id  pred_1  pred_2 
    <dbl>  <chr>  <chr> 
1  27 electronics  home 
2  38  health   NA 
3  60 electronics  beauty 
4  92  home electronics 
5  106  health   NA 
6  117  home  women 

dh eine Reihe pro user_id und eine Erweiterung der pred Spalte in pred_1, pred_2, etc. Irgendwelche Ideen?

UPDATE

Erste Frage gelöst wurde. Follow-up:

Mit dem tidyr::spread Verfahren gibt es eine Möglichkeit, die group_size-N, so dass, um die Kappe beim Streuen, dauert es höchstens N Werte aus jeder Gruppe?

+3

Oder mit der Entwick-Version von data.table 'Bibliothek (data.table) verwenden können; dcast (setDT (df), user_id ~ rowid (user_id)) ' –

+0

Danke allen, aber ich sehe nicht wirklich, wie das ein Duplikat der anderen Frage ist. Wenn überhaupt, ist dies eine viel prägnantere Möglichkeit, die Funktionalität von 'tidyr :: spread' offenzulegen. –

+0

Die Lösung dort ist identisch. Und es gibt Dutzende von ähnlichen Lösungen überall in SO, während viele von ihnen von demselben Benutzer gepostet werden. Sie können einige von ihnen [hier] (http://stackoverflow.com/search?q=user%3A3732271+1%3A.N+dcast) und [hier] (http://stackoverflow.com/search?q = Benutzer% 3A3732271 + Zeilennummer + Spread) –

Antwort

2

Wir erstellen eine Sequenzspalte nach der Gruppierung von 'user_id' und dann spread von 'lang' bis 'breit'.

library(dplyr) 
library(tidyr) 
df1 %>% 
    group_by(user_id) %>% 
    mutate(id = paste0("pred_", row_number()), 
      id = factor(id, levels = unique(id))) %>% 
    spread(id, pred) 
# user_id  pred_1  pred_2 
#  <int>  <chr>  <chr> 
#1  27 electronics  home 
#2  38  health  <NA> 
#3  60 electronics  beauty 
#4  92  home electronics 
#5  106  health  <NA> 
#6  117  home  women 

Oder wir dcast von data.table

library(data.table)#1.9.7+ 
dcast(setDT(df1), user_id~paste0("pred_", rowid(user_id)), value.var = "pred") 
+0

Ich renne in (was ich zu sein) ein Fehler, wo die 'pred_' Werte nicht in Ordnung sind. Zum Beispiel: Die Reihenfolge meiner Spalten lautet 'pred_1',' pred_10', 'pred_11', ... und so weiter. 'pred_2' ist in Spalte 48 –

+0

@NickResnick Ich habe den Beitrag für dplyr/tidyr aktualisiert. Bitte prüfen Sie, ob es hilft. – akrun

+0

danke! Kannst du die aktualisierte Frage auch beantworten? Konkret, können Sie die Anzahl der erstellten Spalten auf eine Zahl kleiner als max_grouping setzen? –