2016-08-01 10 views
2

Я пытаюсь преобразовать таблицу, как это:Расширение колонки на основе другого столбца группировки (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 

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

# 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 

т.е. ряд за user_id и расширение колонки pred до pred_1, pred_2 и т. д. Любые идеи?

UPDATE

Первоначальный вопрос был решен. Последующее:

Используя метод tidyr::spread, есть способ, чтобы увенчать group_size к N так, что, когда распространение, оно принимает в большинстве N значений из каждой группы?

+3

Или с помощью версии Devel из data.table 'библиотеки (data.table); dcast (setDT (df), user_id ~ rowid (user_id)) ' –

+0

Спасибо всем, но я действительно не вижу, как это дубликат другого вопроса. Во всяком случае, это гораздо более лаконичный способ разоблачения функциональности 'tidyr :: spread' –

+0

Решение там одинаково. И есть множество подобных решений по всему SO, в то время как многие из них размещены одним и тем же пользователем. Вы можете проверить некоторые из них [здесь] (http://stackoverflow.com/search?q=user%3A3732271+1%3A.N+dcast) и [здесь] (http://stackoverflow.com/search?q = пользователь% 3A3732271 + row_number + spread) –

ответ

2

Мы создаем столбец последовательностей после группировки 'user_id', а затем spread от 'long' до 'wide'.

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 

Или мы можем использовать dcast из data.table

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

Я столкнулся с ошибкой, в которой значения 'pred_' не соответствуют порядку. например: порядок моих столбцов идет 'pred_1',' pred_10', 'pred_11', ... и так далее. 'pred_2' находится в столбце 48 –

+0

@NickResnick Я обновил сообщение для dplyr/tidyr. Пожалуйста, проверьте, помогает ли это. – akrun

+0

спасибо! можете ли вы ответить на обновленный вопрос? В частности, можете ли вы выбрать количество столбцов, которые оно создает, чтобы число было меньше, чем 'max_grouping'? –

 Смежные вопросы

  • Нет связанных вопросов^_^