将来のデータ分析を効率化するために、data.frame に含まれるさまざまな自己報告スケールを識別し、各スケールのアイテムに対して定期的な分析を実行するスクリプトを作成しようとしています。現在、どのスケールが存在するかを識別し、スケールの各アイテムの応答を見つけて、各スケールのクロンバックのアルファを計算したいと考えています。
各スケールの 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)