table() генерирует NA, когда в базовых данных нет 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. стол из:

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 ответа

Решение

После установки пакета 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 используя countC:=N, Три виньетки на странице CRAN в data.table - хорошее место, чтобы начать больше узнавать о том, как это работает.

Вопрос под рукой. О, я думаю, я вижу, в чем была первоначальная проблема. предполагать 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 которые не на самом верху, вы увидите NAs.

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происходят на 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) но я предполагаю, что вы создадите таблицу из этого нового фрейма данных.

Решение, которое, кажется, сработало

C$countC <- таблица (C $ A1) [as.character (C $ A1)]

Я индексировал по числовому вектору, где имена таблицы являются символами. Duh!

Другие вопросы по тегам