ADP (R)

[R] use column names for `x` 오류 해결

멋쟁이천재사자 2022. 11. 15. 13:52

오류

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


 

 

참고자료

https://stackoverflow.com/questions/54963790/error-please-use-column-names-for-x-when-using-caret-for-logistic-regressio