2015-06-03 80 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