仅在R中交叉列表真值

时间:2011-08-01 16:18:07

标签: r

我有一个数据框“dataAll”和一些变量(A,B),我想要一个像

这样的表
   A   >10    >20     >30

B

>1

>10

>100

为此,我编码为

with(dataAll,table(A = A> 10,B = B> 1))给了我

         A
               FALSE    TRUE
B

        FALSE  220357   4798

        TRUE  596618 210080

所以,这里的值210080应该转到上表中的第一个单元格

我尝试过这样的事情没有成功

with(dataAll,table(A = A> c(10,20,30),B = B> c(1,10,100)))

甚至

with(dataAll,table(A = c(A> 10,A> 20,A> 30),B = c(B> 1,B> 10,B> 100)))

但没有成功,

我知道应该有办法做到这一点......

3 个答案:

答案 0 :(得分: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版本时,他将其设置为默认选项。

当您使用Tommy构建的示例执行此操作时,您将获得

> 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

并非每个人都理解开放/封闭的约定,所以有时您需要进入并重新构造使用labels构造的因子变量的cut,以便数学上较不倾向的客户端可以将其映射到他的约定。您使用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

答案 1 :(得分: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)))

答案 2 :(得分:2)

这是一个基于vapply的小解决方案。假设您想要每个单元的总计数(例如,A> 20&amp; B> 100) - 而不是(A> 20&amp; A&lt; 30)&amp;的计数。 (B> 100&amp; 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)计算TRUE值,然后通过调用a对所有vapply条件执行此操作。

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

然后对每个b条件再次执行此操作,并为(转置)结果添加一些dimnames。