ปัญหาในการใส่ค่าที่หายไปด้วย kNN ใน r

ฉันต้องการแทนค่าที่หายไปด้วยค่าเฉลี่ยของเพื่อนบ้านที่ใกล้ที่สุด แต่เมื่อฉันลองใช้ kNN มันแสดงข้อความแสดงข้อผิดพลาด

ดังนั้นเวกเตอร์คือราคาหุ้น หมายความว่าฉันมี NA ในช่วงสุดสัปดาห์ ฉันต้องการแทนที่ค่า NA (วันเสาร์ วันอาทิตย์) ด้วยฟังก์ชันเว้า: (ค่าวันศุกร์ + ค่าวันจันทร์)/2 ฉันคิดว่าฟังก์ชัน kNN ที่มี k=2 จะเหมาะสม แต่ฉันได้รับข้อความแสดงข้อผิดพลาด

> Oriental_Stock$Stock
 [1] 42.80 43.05 43.00 43.00 42.20    NA    NA 42.50 40.00 40.25 40.55 
 41.50    NA    NA 40.85
> kNN(Oriental_Stock, variable = colnames("Stock"), k = 2)
Error in `[.data.table`(data, indexNA2s[, variable[i]], `:=`(imp_vars[i],  
 : i is invalid type (matrix). Perhaps in future a 2 column matrix could 
  return a list of elements of DT (in the spirit of A[B] in FAQ 2.14). 
  Please report to data.table issue tracker if you'd like this, or add 
  your comments to FR #657.

โปรดแจ้งให้เราทราบว่าเป็นไปได้หรือไม่และอาจมีตัวเลือกที่ง่ายกว่า kNN ฉันไม่ใช่ Data Scientist แค่เป็นนักเรียน ดังนั้นฉันจึงไม่ค่อยรู้เรื่องนี้มากนัก ขอบคุณล่วงหน้าสำหรับข้อเสนอแนะใด ๆ !


person Valeriya    schedule 19.06.2019    source แหล่งที่มา


คำตอบ (1)


Knn จะทำงานบน data.frame โดยจะเลือกเพื่อนบ้านตามระยะห่างระหว่างแถวของคุณ มันใช้ไม่ได้กับเวกเตอร์

for-loop อาจเป็นวิธีแก้ปัญหาที่ยุติธรรมสำหรับสิ่งนี้:

#this finds the locations of the first NA of each couple of NAs
#the TRUE / FALSE part below picks only the first NA from each couple
idx <- which(is.na(stock))[c(TRUE, FALSE)]

#this iterates over the above indexes and calculates the mean and updates the NAs
for (x in idx) {
  stock[x] <- stock[x+1] <- (stock[x-1] + stock[x+2]) / 2
}

ผลลัพธ์:

> stock
 [1] 42.800 43.050 43.000 43.000 42.200 42.350 42.350 42.500 40.000
[10] 40.250 40.550 41.500 41.175 41.175 40.850

ฉันใช้ stock เป็นข้อมูล:

stock <- c(42.80,43.05, 43.00, 43.00, 42.20,    NA,    NA, 42.50, 40.00, 40.25, 40.55, 
           41.50,    NA,    NA, 40.85)
person LyzandeR    schedule 19.06.2019