2016-08-01 2 views
2

나는이 같은 테이블을 변환하기 위해 노력하고있어 :확장 열

# 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 

즉 행 :

# 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 

다음과 같습니다 하나 user_id에 따라 pred 열을 pred_1, pred_2 등으로 확장 할 수 있습니다. 초기 문제가 해결되었다

UPDATE. 후속 : 확산 때

에서, tidyr::spread 방법을 사용하여 group_size 있도록 N에 상한선을 할 수있는 방법이, 각 그룹에서 가장 N 값에 소요?

+3

또는 (data.table) data.table'라이브러리 (STABLE) 버전을 사용하는 dcast을 사용할 수 있습니다; dave (setDT (df), user_id ~ rowid (user_id))' –

+0

모두에게 감사하지만이 질문이 다른 질문과 중복되는 것을 실제로 볼 수는 없습니다. 무엇이든, 이것은'tidyr :: spread'의 기능성을 드러내는 훨씬 더 간결한 방법입니다. –

+0

거기에있는 해결책은 동일합니다. 그리고 많은 사람들이 동일한 사용자에 의해 게시되는 동안 비슷한 솔루션이 수십 가지 있습니다. 일부는 [여기] (http://stackoverflow.com/search?q=user%3A3732271+1%3A.N+dcast) 및 [여기] (http://stackoverflow.com/search?q = 사용자 % 3A3732271 + 행 번호 + 스프레드) –

답변

2

'user_id'로 그룹화 한 후 시퀀스 열을 만들고 'long'에서 'wide'까지 spread을 만듭니다.

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 

아니면 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'보다 적은 수로 선택할 수 있습니까? –

관련 문제