2011-08-01 101 views
1

我有一個數據幀「dataAll」和一些瓦爾真值(A,B)就可以了,我要像交叉製表僅R中

A >10 >20  >30 

B 

>1 

>10 

>100 

表要做到這一點,我編寫像

與(dataAll,表(A = A> 10,B = B> 1))這使我

  A 
       FALSE TRUE 
B 

     FALSE 220357 4798 

     TRUE 596618 210080 

所以,這裏的值210080應到第一小區中的上表

我試圖像這樣沒有成功

與(dataAll,表(A = A> C(10,20,30),B = B> C(1,10,100)))

甚至

與(dataAll,表(A = C(A> 10,A> 20,A> 30),B = C(B> 1,B> 10,B> 100)))

但沒有成功,

我知道應該有辦法做到這一點...

+0

@downvoter:如果你downvote,你應該提供一個原因。這個問題是R中與「重新編碼」變量有關的常見和完全有效的問題。 –

+0

@ user873096:我編輯了您的問題以更好地格式化表格。您只需標記代碼和/或打印輸出並按下「{}」按鈕。 – Tommy

回答

3
A.categ <- cut(A, breaks = c(-Inf, 10, 20, 30, Inf), right=FALSE) 
B.categ <- cut(B, breaks = c(-Inf, 1, 10, 100, Inf), right=FALSE) 
table(A.categ, B.categ) 

訣竅與cut被記住要設置正確= FALSE,因爲這是大多數人期望它的工作方式。事實上,當Frank Harrell爲Hmisc製作他的版本cut2時,他將其設置爲默認選項。

當你做到這一點與湯米cosntructed的例子你

> A.categ <- cut(d$A, breaks = c(-Inf, 10, 20, 30, Inf), right=FALSE) 
>  B.categ <- cut(d$B, breaks = c(-Inf, 1, 10, 100, Inf), right=FALSE) 
>  table(A.categ, B.categ) 
      B.categ 
A.categ  [-Inf,1) [1,10) [10,100) [100, Inf) 
    [-Inf,10)  0  1  1   9 
    [10,20)   0  2  3   2 
    [20,30)   0  5  4   1 
    [30, Inf)  0  17  11   44 

不是每個理解打開/關閉慣例所以有時你需要去和返工您構建了一個因子分解變量的labelscut因此,那些數學上較不重要的客戶可以將其映射到他的約定。您可以使用factor功能並指定labels參數(和不指定levels參數,否則您將「打破變量」)

> A.categ <- factor(A.categ, labels=c(" Less than 1", "1-9.9", "10-99.9" , "100+")) 
>  table(A.categ, B.categ) 
       B.categ 
A.categ  [-Inf,1) [1,10) [10,100) [100, Inf) 
    Less than 1  0  1  1   9 
    1-9.9    0  2  3   2 
    10-99.9    0  5  4   1 
    100+    0  17  11   44 
2

嘗試切換功能。

?cut 

它可以像你想要的那樣工作。

cut(x,breaks,labels,...) 


table(cut(A[which(B<1)],breaks=c(0,10,20,30))) 


table(cut(A[which(B>1)],breaks=c(0,10,20,30))) 
+0

這是很好的解決方法,thatnks ..而我想要的是每個細胞之間沒有介於總之,但有東西比沒有好,我總是可以做出累積的那些..謝謝 – Ananta

2

這裏有一些基於vapply的解決方案。假設您希望每個單元的總計數(例如,A> 20 & B> 100) - 不是(A> 20 & A < 30)&(B> 100 & B < 1000)的計數。

# Create some data 
set.seed(42) 
n <- 100; 
dataAll <- data.frame(A=runif(n, 1,100), B=10^runif(n, 0, 4)) 

# And some break points  
a <- 1:10*10 # 10, 20 etc... 
b <- 10^(0:4) # 1, 10, 100, 1000 


f <- function(A, a, B, b) { 
    structure(t(vapply(b, function(bb) { 
    vapply(a, function(aa, A) sum(A > aa), 1, A[B > bb])  
    }, a)), dimnames=list(B=b, A=a)) 
} 

f(dataAll$A, a, dataAll$B, b) 

其中給出如下表:

 A 
B  10 20 30 40 50 60 70 80 90 100 
    1  89 82 72 63 55 46 34 23 16 0 
    10 65 60 55 47 41 34 26 18 12 0 
    100 47 45 44 39 34 28 21 14 10 0 
    1000 20 19 18 17 16 12 8 5 5 0 
    10000 0 0 0 0 0 0 0 0 0 0 

這一切的肉來算真值了一個a條件sum(A > aa),然後做所有a條件一起vapply通話。

vapply(a, function(aa, A) sum(A > aa)  

然後再做一遍每個b條件,有的dimnames添加到(移位的)結果。

+0

非常感謝,這正是我需要,但是,我在所有單元格中都獲得了「NA」。我會嘗試播放代碼,因爲我有這個概念... – Ananta

+0

我更新了答案,以便它使用'dataAll'並將其包裝在函數f中。 ...如果答案是你所需要的,那麼你應該標記爲答案。你也應該提高你喜歡的答案(和問題)。只需點擊左上角的分數! – Tommy