我想生成一列特定变量的计数。最简单的方法似乎是使用table()。对于相当少量的数据,似乎没有问题。
A <- data.frame(A1 = sample(1:1000, 100000, replace = TRUE))
B <- data.frame(B1 = sample(1:1000, 100000, replace = TRUE))
C <- cbind(A, B)
C$countC <- table(as.factor(C$A1))[C$A1]
summary(C$countC)
Min. 1st Qu. Median Mean 3rd Qu. Max.
65 94 101 101 108 132
但是,如果我从一个较大的集合构建一个表(请注意,现在我从1:10k采样,而不是1:1k),它会生成NA,尽管数据中没有NA' m建立一个表:
A <- data.frame(A1 = sample(1:10000, 100000, replace = TRUE))
B <- data.frame(B1 = sample(1:10000, 100000, replace = TRUE))
C <- cbind(A, B)
C$countC <- table(as.factor(C$A1))[C$A1]
summary(C$A1)
Min. 1st Qu. Median Mean 3rd Qu. Max.
1 2512 5005 5008 7502 10000
summary(C$countC)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
1.00 8.00 10.00 10.18 12.00 25.00 7
如果数据不在数据框中,则不会出现此问题。
A <- sample(1:10000, 1000000, replace = TRUE)
summary(table(as.factor(A))[A])
Min. 1st Qu. Median Mean 3rd Qu. Max.
57 94 101 101 108 144
有谁知道原因?
答案 0 :(得分:1)
set.seed(500)
A <- data.frame(A1=sample(2:1000, 100000, replace=TRUE), stringsAsFactors=FALSE)
B <- data.frame(B1=sample(1:1000, 100000, replace=TRUE), stringsAsFactors=FALSE)
C <- cbind(A,B)
C$countC <- table(as.factor(C$A1))[C$A1]
summary(C$countC)
查看此示例,我们发现NA
s出现在1000
“因子”:
summary(C[is.na(C$countC),"A1"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
1000 1000 1000 1000 1000 1000
我认为您的A1
对象没有填写所有可能的因素,但在cbind
table
认为应该这样做之后,因此当它到达时因为用尽了因素到你的样本结束。
> str(C$A1)
int [1:100000] 834 726 976 469 813 207 513 926 830 712 ...
> str(as.factor(C$A1))
Factor w/ 999 levels "2","3","4","5",..: 833 725 975 468 812 206 512 925 829 711 ...
一个明显的解决方案就是使用table(A$A1)
,但我猜你要从这个新数据框生成表。
答案 1 :(得分:1)
安装data.table包并做一些预备......
require(data.table)
n0<- 1e5
n <- 1e6
DT <- data.table(A1 = sample(1:n0, n, replace = TRUE),B1 = sample(1:n0, n, replace = TRUE))
这就是诀窍。
setkey(DT,A1)
DT[
DT[,.N,by=A1],
countC:=N
]
使用DT[i,j]
访问data.table时,您可以选择i
行,并使用j
执行其他操作,就像在data.frames中一样。
DT[,.N,by=A1]
选择所有行(因为i
为空)并使用特殊变量.N
计算每个“A1”的行数。
在将列“A1”设置为DT的键之后,我们可以传递data.table - 在这种情况下DT[,.N,by=A1]
- 在i
中合并后面data.table中的信息。 。在j
中,我们使用countC:=N
在DT中创建一个新列。 data.table's CRAN page上的三个小插图是开始更多了解其工作原理的好地方。
手头的问题。哦,我想我知道原来的问题是什么。假设unique(x)=c(1,2,4)
。如果您尝试table(x)[x]
,则会尝试访问table(x)[1]
,table(x)[2]
和table(x)[4]
。最后一个是未定义的,因为表的长度仅为3.当我们访问大于向量长度的索引时,R总是返回NA
。例如,请查看(1:3)[4]
。
在您的情况下,如果您遗漏了1:n0
中不在最顶层的任何唯一值,您会看到NA
s。
答案 2 :(得分:0)
似乎有效的解决方案是
C $ countC&lt; - table(C $ A1)[as.character(C $ A1)]
我正在使用数字向量进行索引,其中表的名称是字符。咄!