2011-08-29 4 views
2

I 2 열이 다른 데이터 프레임을 생성하고자데이터 프레임에서 다른 데이터 프레임으로 Rep 값. 대다? 사프티? I 데이터 프레임 다음 한

data<-data.frame(ID=c("a", "b", "c", "d"), zeros=c(3,2,5,4), ones=c(1,1,2,1)) 


    ID zeros ones 
1 a  3 1 
2 b  2 1 
3 c  5 2 
4 d  4 1 

및 다음 ID 반복

제 1 열 (ID) (영 +들) 시간 제 2 열 값 결과가

id value 
1 a 0 
2 a 0 
3 a 0 
4 a 1 
5 b 0 
6 b 0 
7 b 1 
8 c 0 
9 c 0 
10 c 0 
11 c 0 
12 c 0 
13 c 1 
14 c 1 
15 d 0 
16 d 0 
17 d 0 
18 d 0 
19 d 1 

I 될 것이라고 C (대표 (0, 제로), 담당자 (1, 사람)) 그래서

을해야한다 시도했지만 data.frame(id=(rep(data$ID, (data$zeros+data$ones))), value=c(rep(0, data$zeros), rep(1, data$ones))) 나던. 어떤 아이디어? 사전에 감사

답변

4

이것은 plyr 패키지에서 ddply를 사용하여, 아마도 과잉이지만, 나에게 온 첫 번째 일이 :

ddply(dat,.(ID),function(x){data.frame(value = rep(c(0,1),times = c(x$zeros,x$ones)))}) 

아, 그리고 I가 dat에 데이터 프레임의 이름을 변경 나쁜 습관을 피하십시오 (data은 자주 사용되는 함수의 이름입니다). 이미 첫 번째 열에 대한 기본 R 솔루션을 가지고 있기 때문에

1

,이 두 번째 열에 하나입니다

lengths<-as.vector(t(as.matrix(data[,2:3]))) #notice the t 
what<-rep(c(0,1), nrow(data)) 
times<-rep(what, lengths) 

편집가 : 위의 사소한 일을 변경하고 테스트했습니다. 이제 작동합니다.

1

다음은 기본 R 솔루션입니다.

dat <- data.frame(ID = letters[1:4], zeros = c(3,2,5,4), ones = c(1,1,2,1)) 

do.call("rbind" 
    , apply(dat, 1, function(x) 
     data.frame(cbind(id = x[1], value = rep(0:1, times = x[2:3]))) 
    ) 
) 
0

가 나는 또한 plyr 방법을 선호하지만, 내가 먼저 데이터를 재편 한 다음 복제와 관련된 또 다른 기본 R 솔루션을 던질 거라고 생각 : 나 자신을 plyr의 과잉을 선호합니다. 이 중간 저장을 필요로하기 때문에 다른 기본 솔루션의 일부처럼 우아하지

names(dat)[2:3] <- c("times.0", "times.1") 
tmp <- reshape(dat, varying=2:3, direction="long") 
tmp <- tmp[rep(seq(length=nrow(tmp)),tmp$times),c("ID","time")] 
names(tmp) <- c("id","value") 
tmp <- tmp[order(tmp$id, tmp$value),] 
rownames(tmp) <- NULL 

을하지만, 아마도 흥미 : (또한 dat 대신 data의 사용).

관련 문제