2015-06-03 56 views
2

我将X的值分成5个框并计算其联合概率。R:查找范围X

在下面的例子中,由于X中有很多2,所以最后我只有4个盒子。

实施例:

X <-c(1,2,2,2,2,3,4,5,6,7) 
Y <-c(0,1,1,1,0,1,0,1,0,1) 
qX=quantile(X, 1:4/5) # find quantiles 20%,40%,60%,80% 
qY=c(0,1) 
dX=findInterval(X,qX,rightmost.closed=TRUE) 
dY=findInterval(Y,qY+0.001,rightmost.closed=TRUE) 
pXY=xtabs(~dX+dY)/10 # joint distribution 
rownames(pXY) <- paste("box",1:dim(pXY)[1],sep="") 


> pXY 
      dY 
dX  0 1 
box1 0.1 0.0 
box2 0.1 0.4 
box3 0.1 0.1 
box4 0.1 0.1 

现在我想要添加一个列X中的每个框的范围内。 所需表将是:

box1 [1,1] 0.1 0.0 
box2 [2,3] 0.1 0.4 
box3 [4,5] 0.1 0.1 
box4 [6,7] 0.1 0.1 
+3

你说希望的输出,然后张贴实现输出代码。你有什么问题? – josliber

+0

我只想为每个框中的X范围再增加一列。底部的pXY不提供X的范围。 – Meng

回答

1

xtabs的或table输出是有点杂乱加入。我会转换成matrix

pXY2 <- pXY; class(pXY2) <- "matrix" 
data.frame(r=t(sapply(split(X,dX),range)),pXY2) 
# r.1 r.2 X0 X1 
# 0 1 1 0.1 0.0 
# 2 2 3 0.1 0.4 
# 3 4 5 0.1 0.1 
# 4 6 7 0.1 0.1 

鉴于用来制造dX的分割点,在框中的值真的是0,2,3,4,不1,2,3,4。


如果要打印带有特殊格式的范围内,考虑写一个自定义函数:

brackem <- function(x) paste0("[",x[1],",",x[2],"]") 
data.frame(r=tapply(X,dX,function(z)brackem(range(z))),pXY2) 
#  r X0 X1 
# 0 [1,1] 0.1 0.0 
# 2 [2,3] 0.1 0.4 
# 3 [4,5] 0.1 0.1 
# 4 [6,7] 0.1 0.1