我一直在寻找,我无法弄清楚如何在我的数据框中提取数据(受某些范围限制)。我知道可以在应用daaply / taaply或table的某些组合时完成,但是我无法得到我期望的确切结果。
基本上我想转此:
part_no val1 val2 val3
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
进入这个:
part_no val3_between0_50 val3_bw50_100 val3_bw-50_0 val3_bw-100_-50
2 1 0 0 1 0
3 0 1 0 1 1
这是虚拟数据,我有更多行,但想法是一样的。我只想计算满足特定条件的参与者的值的数量。
如果有人能够一步一步解释,我会非常感激。我看到很多不同的小帖子,但没有一个完全如此,我的尝试只让我走了一半。就像使用table
等
答案 0 :(得分:2)
下面的一个更好的解决方案(不需要下面使用的额外行,但如果你想将重命名代码移动到这个矩阵结果,你可以):
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
。事实上它运作得很好,我将把它发布在最顶层。