2011-08-29 184 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 

不优雅一些其它碱溶液的,因为它要求中间存储,但可能有趣。

相关问题