Отсутствуют пропущенные значения, но во время KNN R преобразует их в значения NA - PullRequest
0 голосов
/ 14 марта 2019

За свою жизнь я не могу понять, почему R внезапно преобразует мои значения в NA.

library(class)
attach(alcohol)
trainknn=cbind(Pstatus, absences, internet)[testsamples,]
testknn=cbind(Pstatus, absences, internet)[-testsamples,]
**trainknn.Walc=test$Walc[testsamples]**
set.seed(1)
knn.pred=knn(trainknn, testknn, trainknn.Walc, k=6)
knn.predtest=sample(knn.pred,57,replace=T)

Строка с ** - это та, которая доставляет мне неприятности (очевидно, звезд нет в моем настоящем коде). Я разделил данные обучения и тестирования на код, которого здесь нет, но я уверен, что все в порядке. Когда я прошу напечатать Walc, все значения там. Когда я печатаю тест $ Walc, все значения там. Это только когда я добавляю [testsamples], когда он внезапно возвращает почти все значения NA. Кто-нибудь знает, почему это происходит?

Редактировать: вот как я разделил данные

set.seed(1)
testsamples=sample(1:nrow(alcohol), size=.10*nrow(alcohol))
test=alcohol[testsamples,]
train=alcohol[-testsamples,]
nrow(test)

1 Ответ

0 голосов
/ 14 марта 2019

Если вы попытаетесь задать вектор с несуществующими индексами, он вернет NA для этих значений. Это можно увидеть с помощью набора данных mtcars:

# mtcars$mpg is a vector 32 items long:
length(mtcars$mpg)
[1] 32

Когда вы вводите подмножество в квадратных скобках, используя индексы <32, он возвращает соответствующие значения. Когда вы используете индекс вне диапазона (например, 999 ниже), он возвращает <code>NA:

mtcars$mpg[c(1,14,21,999)]
[1] 21.0 15.2 21.5   NA

В вашем примере вы используете sample, чтобы выбрать 64 случайных строки из alcohol по номеру строки. Затем вы используете это для подмножества alcohol в test, которое имеет только 64 строки. Затем, когда вы пытаетесь установить подмножество test, используя testsamples, вы запрашиваете строки, которых нет в test, так как они короче. В этих случаях вы получите NA вместо запрошенной строки.

...