오류
Error: Please use column names for `x`
발생
caret::train 을 이용하여 knn 알고리즘으로 훈련을 시도하다가 발생
재현
library(caret)
library(dplyr)
airquality %>%
select(Solar.R,Temp ) %>%
mutate(n=row_number()) %>%
filter(!is.na(Solar.R)) -> train
knnFit1 <- train(train[,2], train[,1],
method = "knn",
preProcess = c("center", "scale"),
tuneLength = 10,
trControl = trainControl(method = "cv"))
원인
train()의 첫번째 인자에 단일칼럼 데이터프레임을 사용하기 위해 train[,2] 를 잘못 사용
해결 방법
train[,2] 대신에 train[,2,drop = FALSE] 또는 train[2] 사용
설명
오직 하나의 독립 변수를 구성하기 위해 단일 칼럼 데이터프레임으로 변환하려고 할 때 이런 오류가 발생합니다.
[] 의 동작 방식을 이해하기 위해 ?"[" command 를 통해 [] 의 동작 방식을 확인해보지요.
drop 이라는 인자가 있습니다.
For matrices and arrays.
If TRUE the result is coerced to the lowest possible dimension (see the examples).
흔히 생략되고 있는 이 인자는 디폴트값이 TRUE 인데 가능한 가장 작은 차원으로 강제 변환되나 봅니다.
아직 충분히 이해하지 못했는데, 이러한 coerced 과정으로 data.frame 의 구조가 깨지면서 오류로 연결됩니다.
example 을 보면 drop = FALSE 를 주어 형태를 유지시켜주고 있습니다.
직관적인 기대치로는 drop = FALSE 가 디폴트값이어야 할 것 같습니다.
x <- 1:12
m <- matrix(1:6, nrow = 2, dimnames = list(c("a", "b"), LETTERS[1:3]))
m[1, , drop = FALSE] # is a 1-row matrix
참고자료
'ADP (R)' 카테고리의 다른 글
ADP 27회 실기 합격 - 사전점수공개 (0) | 2022.12.16 |
---|---|
ADP 27회 실기 후기 (0) | 2022.11.28 |
[R] length of 'dimnames' [2] not equal to array extent (0) | 2022.10.30 |
[R]`data` and `reference` should be factors... (0) | 2022.10.30 |
[R] factor() vs as.factor() (0) | 2022.10.28 |