1

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

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 

有谁知道原因?

4

3 回答 3

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
]

当您使用 访问 data.table 时DT[i,j],您可以使用 选择行i并使用 执行其他操作j,就像在 data.frames 中一样。

DT[,.N,by=A1]选择所有行(因为i是空白)并使用特殊变量计算每个“A1”的行数.N

将列“A1”设置为 DT 的键后,我们可以传入一个 data.table(在这种情况下DT[,.N,by=A1]),i以合并回后者 data.table 中的信息。在j中,我们使用 DT 在 DT 中创建一个新列countC:=Ndata.table 的 CRAN 页面上的三个小插曲是开始了解其工作原理的好地方。

手头的问题。哦,我想我明白原来的问题是什么了。假设unique(x)=c(1,2,4)。如果您尝试table(x)[x],您将尝试访问table(x)[1]table(x)[2]并且table(x)[4]。最后一个是未定义的,因为表的长度只有 3。NA当我们访问大于向量长度的索引时,R 总是返回。例如,查看(1:3)[4].

在您的情况下,如果您缺少任何1:n0不在最顶部的唯一值,您将看到NAs。

于 2013-05-20T08:15:35.327 回答
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)

查看此示例,我们发现NAs 出现在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),但我猜你是从这个新的数据框生成表格。

于 2013-05-20T08:09:10.370 回答
0

一个似乎有效的解决方案是

C$countC <- table(C$A1)[as.character(C$A1)]

我按数字向量进行索引,其中表的名称是字符。呸!

于 2013-05-21T00:07:26.453 回答