Чтобы упорядочить анализ будущих данных, я пытаюсь написать сценарий, который будет определять различные шкалы самоотчетов, включенные в файл data.frame, и выполнять рутинные анализы для каждого объекта шкалы. В настоящее время я хочу, чтобы он определил, какие масштабы присутствуют, найдите ответы для каждого из предметов шкалы, а затем вычислите Альфах Кронбаха для каждой шкалы.Переменный класс отличается внутри функции?
Все, кажется, работает только, когда я запускаю свою функцию, которая должна произвести список альфа() выводит для каждого масштаба я получаю следующее сообщение об ошибке:
> Cronbach.Alphas(scales.data, scale.names)
Error in alpha(data[, responses[[i]]]) :
Data must either be a data frame or a matrix
Очевидно, что я знаю, что это говорит информация присвоение функции alpha() не является кадром данных или матрицей. Причина, по которой я так запуталась, заключается в том, что когда я делаю эти вычисления вручную шаг за шагом вне моей функции Cronbach.Alphas(), она ясно говорит мне, что это data.frame и, похоже, работает как шарм:
> class(scales.data[,responses[[1]]])
[1] "data.frame"
Это сводит меня с ума, и я буду очень благодарен за любую помощь в этом. Мой полный код вставлен ниже. (Примечание: я довольно новичок в программировании функций в R, поэтому способ, которым я занимаюсь, вероятно, не оптимален. Также можно получить дополнительные советы.)
Кроме того, это может помочь упомянуть, что мой код предназначенные для идентификации имен шкал на основе наличия подчеркивания в имени столбца. То есть, «rsq_12» указывает масштаб как rsq и столбец в качестве ответов на элемент 12 шкалы.
require(psych)
##### Function for identifying names of scales present in the data file #####
GetScales <- function(x) {
find.scale.names <- regexec("^(([^_]+)_)", colnames(x))
scales <- do.call(rbind, lapply(regmatches(colnames(x), find.scale.names), `[`, 3L))
colnames(scales) <- "scale"
na.find <- ifelse(is.na(scales[,1]), 0, 1)
scales <- cbind(scales, na.find)
output <- scales[scales[,2] == 1,]
output[,1]
}
##### Function for calculating cronbach's alpha for each scale #####
Cronbach.Alphas <- function(data, scales){
for(i in 1:length(scales)){
if(i == 1) {
responses <- list(grep(scales[i], colnames(data)))
alphas <- list(alpha(data[,responses[[i]]]))
} else {
responses <- append(responses, list(grep(scales[i], colnames(data))))
alphas <- append(alphas, list(alpha(data[,responses[[i]]])))
}
}
return(alphas)
}
### Import data from .csv file ###
scales.data <- data.frame(read.csv(file.choose()))
### Identify each item's scale ###
scale.items <- GetScales(scales.data)
### Reduce to names of scales ###
scale.names <- cbind(scale.items, !duplicated(scale.items))
scale.names <- scale.names[scale.names[,2] == TRUE, 1]
scale.names
### Calculate list of alphas ###
Cronbach.Alphas(scales.data, scale.names)
Помогает ли добавить альфа (данные [, ответы [[i]], drop = FALSE]) '? –