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
которые не на самом верху, вы увидите NA
s.
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!