我有一个数据框“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)))
但没有成功,
我知道应该有办法做到这一点......
答案 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。