【发布时间】:2013-02-23 07:42:27
【问题描述】:
为了简化未来的数据分析,我正在尝试编写一个脚本来识别 data.frame 中包含的不同自我报告量表,并对每个量表的项目执行常规分析。目前,我希望它识别存在哪些量表,找到每个量表项目的响应,然后计算每个量表的 Cronbach's Alphas。
一切似乎都在工作,除了当我运行我的函数应该为每个比例生成一个 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)
【问题讨论】:
-
加
alpha(data[, responses[[i]], drop=FALSE])有帮助吗?