Использование функции apply () для итерации по различным типам данных не работает

Я хочу написать функцию, которая динамически использует разные методы корреляции в зависимости от масштаба измерения объекта (непрерывного, дихотомического, ординального). Метка всегда непрерывна. Моя идея состояла в том, чтобы использовать функцию apply (), поэтому перебирайте каждую функцию (aka column), проверяйте ее масштаб измерения (числовой, коэффициент с двумя уровнями, коэффициент с более чем двумя уровнями), а затем используйте соответствующую функцию корреляции. К сожалению, мой код, похоже, преобразует каждую функцию в вектор символа, и, как следствие, условие в операторе if всегда является ложным для каждого столбца. Я не знаю, почему мой код это делает. Как я могу запретить конвертировать мои объекты в векторы символов?

set.seed(42)    
foo <- sample(c("x", "y"), 200, replace = T, prob = c(0.7, 0.3))    
bar <- sample(c(1,2,3,4,5),200,replace = T,prob=c(0.5,0.05,0.1,0.1,0.25))    
y <- sample(c(1,2,3,4,5),200,replace = T,prob=c(0.25,0.1,0.1,0.05,0.5))    
data <- data.frame(foo,bar,y)    
features <- data[, !names(data) %in% 'y']

dyn.corr <- function(x,y){      
  # print out structure of every column
  print(str(x))

  # if feature is numeric and has more than two outcomes use corr.test
  if(is.numeric(x) & length(unique(x))>2){        
    result <- corr.test(x,y)[['r']]        
  } else {        
    result <- "else"        
  }      
}

result <- apply(features,2,dyn.corr,y)

Всего 1 ответ


apply для матриц. Когда вы apply к кадру данных, первое, что происходит, - это принудительное преобразование вашего фрейма данных в матрицу. Матрица может иметь только один тип данных, поэтому все столбцы ваших данных преобразуются в наиболее общий тип среди них, когда это происходит.

Используйте sapply или lapply для работы со столбцами кадра данных.

Это должно работать нормально (я пытался проверить, но я не знаю, какой пакет загрузить, чтобы получить функцию corr.test .)

result <- sapply(features, dyn.corr, income)

Есть идеи?

10000