2013-08-22 4 views
2

데이터 프레임을 행렬로 변환하는 함수를 작성하고 싶습니다. 데이터 프레임은 이벤트 목록입니다. 각 행은 제품을 방문하거나 구매하는 사람에게 해당됩니다.용융 데이터 프레임을 행렬로 변환 R

my.df <- data.frame(person = c('A', 'A', 'B', 'B', 'B', 'C'), 
        week = c(1, 2, 1, 3, 3, 2), 
        event = c('visit', 'buy', 'visit', 'visit', 'buy', 'visit')) 
> my.df 
    person week event 
1  A 1 visit 
2  A 2 buy 
3  B 1 visit 
4  B 3 visit 
5  B 3 buy 
6  C 2 visit 

원하는 출력 매트릭스에는 행이 사람으로 표시되고 열은 주로 표시됩니다. (사람, 주) 항목에서 나는 그 사람이 산다면 "사기"를 원하고, 그렇지 않다면 나는 그 사람이 방문하면 "방문"을 원한다. 그렇지 않으면 그 항목으로 "none"을 갖고 싶다. 보다 구체적으로, 원하는 출력은 다음과 같은 행렬이다 :

> my.mat 
    1  2  3  
A "visit" "buy" "none" 
B "visit" "none" "buy" 
C "none" "none" "visit" 

은 내가 최대로 캐스트를 수행 번호로 이벤트를 변환 한 다음 이벤트에 다시 번호를 변환해야합니다 아이디어를 가지고,하지만 난 이 모든 것을 함께 모으는 방법을 완전히 모르겠다.

unique(event) 
as.numeric(factor(event)) 
unique(event)[as.numeric(factor(event)[1])] 

첫 번째 줄은 여러 가지 이벤트가 당신이 할 방법을 보여줍니다

library(reshape2) 

# there is a variety of ways to get the precedence you like 
# I chose to just sort the strings 
acast(my.df, person ~ week, function(x) {sort(as.character(x))[1]}, 
     value.var = 'event', fill = 'none') 
# 1  2  3  
#A "visit" "buy" "none" 
#B "visit" "none" "buy" 
#C "none" "visit" "none" 
+0

에 대한 두 개의 값이 (B는, 3) ... 그걸 어떻게 해결 하시겠습니까입니까? (마지막 값을 얻은 것처럼 보입니다. 당신이하고 싶은 것입니까?) – Arun

+1

중복이 없다면 (행 4를 제거하면) 직접 할 수 있습니다 :'acast (my.df [-4,] , person ~ week, value.var = "event", fill = "none")''reshape2' 패키지를 읽어 들여야합니다. – Arun

+0

@Arun "방문"보다 "구매"우선 순위를주고 싶기 때문에 여러 값이있는 경우 가장 중요한 이벤트를 원합니다. –

답변

1

@eddi와 @Rodrigo의 답을 바탕으로 작성한 다음 코드는 약간 장황하지만 작동합니다. 더 복잡한 이벤트 순서가 필요한 경우에도 작동합니다.

require(reshape2) # For acast(...) 

# Input data frame 
my.df <- data.frame(person = c('A', 'A', 'B', 'B', 'B', 'C'), 
        week = c(1, 2, 1, 3, 3, 2), 
        event = c('visit', 'buy', 'visit', 'visit', 'buy', 'visit')) 

# Convert event into numbers, with buy > visit 
the.levels <- c('visit', 'buy') 
my.df$event <- as.numeric(factor(my.df$event, levels = the.levels)) 

# Build matrix 
temp <- acast(my.df, person ~ week, function(x) {max(x)}, 
      value.var = 'event', fill = 0) 

# Convert event numbers back into text 
number.to.event <- as.list(setNames(c('none', 'visit', 'buy'), 
           as.character(c(0, 1, 2)))) 
# Save row names and column names 
out <- matrix(number.to.event[as.character(temp)], nrow = 3, 
       dimnames = dimnames(temp)) 

> out 
    1  2  3  
A "visit" "buy" "none" 
B "visit" "none" "buy" 
C "none" "visit" "none" 
2

아룬가 지적한 바와 같이, reshape2 패키지를 사용합니다. 두 번째는 이벤트를 숫자로 변환합니다. 세 번째 요소는 번호가 매겨진 요소를 기준으로 텍스트를 제공합니다 (여기 1 개).

관련 문제