我正在尝试将2个因子类向量(b1和b2)的计数制表/映射到更大的数据帧。载体概述如下:
> summary(b1)
(4,6] (6,8] NA's
16 3 1
> summary(b2)
(4,6] (6,8] NA's
9 0 11
我想将上述计数映射到更大的数据框:
Intervals b1 b2
1 (-Inf,0] NA NA
2 (0,2] NA NA
3 (2,4] NA NA
4 (4,6] NA NA
5 (6,8] NA NA
6 (8,10] NA NA
7 (10,12] NA NA
8 (12, Inf] NA NA
我的问题:是否有一种矢量化或更直接的方式来执行上述操作而不诉诸'for'循环+ if-else条件检查?这似乎很容易做到,但我'我一直有这种心理障碍,我没有成功在线寻找相关的帮助。任何帮助/提示表示赞赏。提前谢谢!
附上我的示例代码:
NoOfElement <- 20
MyBreaks <- c(seq(4, 8, by=2))
MyBigBreaks <- c(-Inf, seq(0,12, by=2), Inf)
set.seed(1)
a1 <- rnorm(NoOfElement, 5); a2 <- rnorm(NoOfElement, 4)
b1 <- cut(a1, MyBreaks); b2 <- cut(a2, MyBreaks)
c <- seq(-10, 10)
d <- cut(c, MyBigBreaks)
e <- data.frame( Intervals=levels(d), b1=NA, b2=NA )
答案 0 :(得分:2)
table
函数执行您需要的制表。它返回一个命名向量,您可以将名称与列e$Intervals
进行比较,以指定正确的值。
这依赖于e$Intervals
和b1
以及b2
中因子级别的顺序相同的事实。之所以如此,是因为这些都来自cut
。
e$b1[e$Intervals %in% names(table(b1))] <- table(b1)
e$b2[e$Intervals %in% names(table(b2))] <- table(b2)
e
## Intervals b1 b2
## 1 (-Inf,0] NA NA
## 2 (0,2] NA NA
## 3 (2,4] NA NA
## 4 (4,6] 16 9
## 5 (6,8] 3 0
## 6 (8,10] NA NA
## 7 (10,12] NA NA
## 8 (12, Inf] NA NA