2011-08-29 180 views
2

我已在數據幀以下從一個數據幀到另一個數據幀的代表值。應用? sapply?

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 

和我希望與2列創建另一個數據幀:

第一列(ID)被重複的ID(零級+的)倍 第二列值應該是C(代表(0,零),代表(1,那些))

使得結果將是

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 

我嘗試data.frame(id=(rep(data$ID, (data$zeros+data$ones))), value=c(rep(0, data$zeros), rep(1, data$ones)))但無效。有任何想法嗎?謝謝你在前進

回答

4

這也許是矯枉過正,使用ddplyplyr包,但它是來找我的第一件事就是:

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

哦,我改變了你的數據幀的名稱dat到避免壞習慣(data是經常使用的函數的名稱)。

1

既然你已經得到了第一列基礎R解決方案,這是一個關於你的第二列:

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解決方案。我喜歡的plyr矯枉過正自己:

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解決方案。 (也使用的dat代替data):

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 

不優雅一些其它鹼溶液的,因爲它要求中間存儲,但可能有趣。

相關問題