table()在基础数据中没有NA时生成NA

时间:2013-05-20 07:11:20

标签: r na

我想生成一列特定变量的计数。最简单的方法似乎是使用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 

有谁知道原因?

3 个答案:

答案 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)]

我正在使用数字向量进行索引,其中表的名称是字符。咄!