2011-11-24 2 views
3

과 열의 행을 바꿀 나는 다음과 같은 데이터가 : 내가 요청 시퀀스를 추출과 열로 이러한 트랜스 싶습니다트랜스 /는 주어진 조건

request user group 
1   1  1 
4   1  1 
7   1  1 
5   1  2 
8   1  2 
1   2  3 
4   2  3 
7   2  3 
9   2  4 

합니다.

결과는 다음과 같아야합니다

user group request1 request2 request3 
1  1  1   4   7 
1  2  5   8   NA 
2  3  1   4   7 
2  4  9   NA   NA 

내가 ddply (plyr)와 함께이 일을 시도했지만 작업 솔루션에 오지 않았다.

미리 감사드립니다.

답변

4
library(reshape) 

# Make some fake data 
dat <- data.frame(user = c(1,1,1,2,2,3), group = c(1,1,1,1,1,2), request = c(1,4,7,5,8,1)) 
# Add in an ordered id 
newdat <- ddply(dat, .(user, group), transform, idx = paste("request", 1:length(request), sep = "")) 
# Use cast to get what we want 
cast(newdat, user + group ~ idx, value = .(request)) 

본질적으로 열 제목이되는 idx라고하는 것을 얻을 수있는 더 좋은 방법이있을 것입니다. newdat 데이터 세트를 만들지 않고이 작업을 수행 할 수도 있지만 이것이 내가 생각한 것입니다.

+0

좋아,이 아주 잘 작동합니까! 고마워요! 하나의 질문이 남아 있습니다. 원래 데이터에는 사용자 및 그룹당 최대 120 개의 요청이 있습니다. 캐스트는'request1 request2 request3 request4 request5 request6 request10 request11 request7'와 같은 idx- 변수의 순서를 변경하는 것 같습니다. 어떻게 처리합니까? – ahs85

+0

대답은 [here] (http://stackoverflow.com/questions/8266915/create-vector-with-fixed-width-fill-with-0/8267036#8267036)에서 찾았습니다.'idx = paste ("request ", 1 : 길이 (요청), sep =" ")','idx = sprintf ("request_ % 03d ", 1 : 길이 (요청))'멋지다! – ahs85

2

aggregate 매우 가까운 당신을 가져옵니다

dat <- data.frame(
    user = c(1,1,1,2,2,3,3,3,4), 
    group = c(1,1,1,1,1,2,2,2,2), 
    request = c(1,4,7,5,8,1,4,7,9) 
) 

aggregate(request~group + user, dat, FUN=c) 

    group user request 
1  1 1 1, 4, 7 
2  1 2 5, 8 
3  2 3 1, 4, 7 
4  2 4  9 
+0

여기에 오류가 발생합니다 : '오류가 발생했습니다.'(문자. 문자 (FUN), 모드 = "함수", envir = envir) : 'function'모드의 'FUN'객체를 찾을 수 없습니다. ' – ahs85

+0

** EDIT ** :'FUN = "c"'는 작동합니다. – ahs85