为了简化未来的数据分析,我正在尝试编写一个脚本,该脚本将识别 data.frame 中包含的不同自我报告量表,并对每个量表的项目执行常规分析。目前,我希望它识别存在哪些量表,找到每个量表项目的响应,然后计算每个量表的 Cronbach Alpha。
一切似乎都在工作,除非我运行我的函数,该函数应该为每个比例生成一个 alpha() 输出列表,我收到以下错误:
> Cronbach.Alphas(scales.data, scale.names)
Error in alpha(data[, responses[[i]]]) :
Data must either be a data frame or a matrix
显然,我知道这是说提供给 alpha() 函数的信息不是 data.frame 或矩阵。不过,我很困惑的原因是,当我在 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)