2011-08-01 67 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