更好的解决方案,它下面的一个(将不需要下面的但如果你想重命名代码移动到这个矩阵的结果,你可以使用额外的行):
xtabs(~part_no +cut(val4, breaks=c(-100, -50, 0, 50, 100)), dat=dat)
#-------------
cut(val4, breaks = c(-100, -50, 0, 50, 100))
part_no (-100,-50] (-50,0] (0,50] (50,100]
2 0 1 1 0
3 1 1 0 1
首先尝试:.... n稍有不同的问题,很容易适应您的情况。我碰到的困难是我的解决方案需要part_no以1开始。您可以稍后分配行标签。或者使'part_no'成为一个因素并使用它的数字模式值。
dat <- read.table(text="part_no val1 val2 val3 val4
1 1 2 3 -32
2 1 2 3 45.3
2 1 3 4 -12.3
3 1 3 4 99.3
3 1 5 2 -3.2
3 1 4 3 -55.3
", head=T)
levs= 4; recs <- matrix(c(unique(dat$part_no),
rep(0, levs*length(unique(dat$part_no)))),
nrow=length(unique(dat$part_no)))
recs[ cbind(dat$part_no,
1+ findInterval(dat$val4, c(-100, -50, 0, 50, 100)))] <- 1
recs
#------------------------------------
[,1] [,2] [,3] [,4] [,5]
[1,] 1 0 1 0 0
[2,] 2 0 1 1 0
[3,] 3 1 1 0 1
#------------------------------------
colnames(recs) <- c(names(dat)[1] ,
paste("val_btwn",
c(-100, -50, 0, 50, 100)[1:4],
c(-100, -50, 0, 50, 100)[2:5],
sep="_"))
recs
#------------------------------------
part_no val_btwn_-100_-50 val_btwn_-50_0 val_btwn_0_50 val_btwn_50_100
[1,] 1 0 1 0 0
[2,] 2 0 1 1 0
[3,] 3 1 1 0 1
而现在,我想我还可以使用cut
和xtabs
下一次。事实上,它工作得很好,我将把它发布在最前面。
如果您以更容易重新规定的格式提供数据,则其他人可以更快地回答问题。 http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – 2012-07-06 15:20:45
同时,看看'cut'功能。 – 2012-07-06 15:21:08
@RichieCotton谢谢,我不知道如何格式化问题,所以我只是把代码块。 – unixsnob 2012-07-06 15:47:40