2016-08-02 2 views
1

나는 데이터가 :R을 사용하여 한 열에 대해 동일한 값을 포함하지만 다른 열에 대해 다른 열을 하나의 단일 행으로 변환하는 방법? 다음과 같이

User_ID Google Facebook Linkedin Monday Tuesday Wednesday 
A  1  1   1   1  1  1 
B  0  1   1   0  1  1 

열 지금은 각 사용자에 대해 나타나는 횟수를 나타냅니다

User_Id  Website  Day 
A  Google Monday 
A  Facebook Tuesday 
A  Linkedin Wednesday 
B  Facebook Tuesday 
B  Linkedin Wednesday 

나는 이런 식으로 뭔가를 달성하고 싶다. R에서 어떻게 할 수 있습니까?

답변

2

우리는 주파수가 table으로 계산하고 data.frame (as.data.frame.matrix)로 변환 수 (rep(df1[,1], 2))이 경우 2, 즉 2와 data.frame (unlist(df1[-1])의 3 열을 unlist 및 다른 컬럼의 숫자로 1 열을 복제 . 우리는 패키지 솔루션을 필요로하는 경우

as.data.frame.matrix(table(rep(df1[,1],2), unlist(df1[-1]))) 
# Facebook Google Linkedin Monday Tuesday Wednesday 
#A  1  1  1  1  1   1 
#B  1  0  1  0  1   1 

또 다른 옵션은 dplyr/tidyr입니다. gather (tidyr)을 사용하여 'wide'에서 'long "형식으로 바꾸고 주파수를 countspread으로 되돌립니다.

library(dplyr) 
library(tidyr) 
df1 %>% 
    gather(Var, Val, -User_Id) %>% 
    count(User_Id, Val) %>% 
    spread(Val, n, fill = 0) 
# User_Id Facebook Google Linkedin Monday Tuesday Wednesday 
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl> 
#1  A  1  1  1  1  1   1 
#2  B  1  0  1  0  1   1 
+0

감사를 다시 확산 reshape2::recast 가진 옵션을 선택합니다. 이 코드를 깨고 그 코드가 무엇인지 설명해 주시겠습니까? 나는 초보자이다. –

+0

@RohitKadam 게시물을 업데이트했습니다. – akrun

+0

설명에 감사드립니다. 지난 이틀 동안이 문제에 대한 해결책을 찾고있었습니다. 마침내 얻었습니다. –

2

기본적으로 첫번째 User_Id에 의해 긴 형식으로 모든 열을 변환 한 후 제안 @akrun에 대한 User_Id에 따라 다시

library(reshape2) 
recast(df, User_Id ~ value, id.var = "User_Id", length) 
# User_Id Facebook Google Linkedin Monday Tuesday Wednesday 
# 1  A  1  1  1  1  1   1 
# 2  B  1  0  1  0  1   1 
+0

David에게 감사드립니다. 이것 역시 효과가있었습니다. 나는 이것이 어떻게이 특별한 패키지와 그 코드를 사용하여 달성 될 수 있는지 처음에 어떻게 알 수 있습니까? –

+1

일반적으로 경험으로. 이 유형의 질문은 이미 여러 번 요청되었습니다. 일반적으로 데이터를 변형하려고 할 때'reshape2' /'tidyr' /'data.table' 패키지를 살펴보고 Google이 "R 모양"또는 "long to wide r"과 그와 유사한 것을 조사해야합니다. 아니면 그냥 대답을보십시오 :) –

+0

헤이 데이비드, 내가 이것을 사용할 때마다 "Var.2"라는 이름의 사용자 ID 옆에 열이 있습니다. 그 이유는 무엇입니까? –

관련 문제