函数内的变量类不同?

时间:2013-02-23 07:42:28

标签: r function

为了简化未来的数据分析,我正在尝试编写一个脚本,用于识别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或matrix。我之所以如此困惑的原因是当我在我的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)

1 个答案:

答案 0 :(得分:0)

感谢任何花时间查看我的代码的人。我感谢您的帮助。当我意识到一个简单的错误时,我正在处理留在这里的建议......

我在处理此脚本时作为测试使用的数据集中的一个比例只有一个项目。因此,我的Cronbach.Alphas()函数中的数据[,response [[i]]]在for循环中的那一点将一个向量(而不是data.frame或matrix)传递给alpha()函数。不可能为单个项目规模计算cronbach alpha,因为它是项目间可靠性的索引......

Sooooo,我需要的所有代码都是一种只用一个项目识别尺度的方法:

    Cronbach.Alphas <- function(data, scales){
      for(i in 1:length(scales)){
        if(i == 1) {
          responses  <- list(grep(scales[i], colnames(data)))
          if(length(responses[[i]]) > 1){
            alphas <- list(alpha(data[,responses[[i]]]))
          }
        } else {
          responses  <- append(responses, list(grep(scales[i], colnames(data))))
          if(length(responses[[i]]) > 1){
            alphas <- append(alphas, list(alpha(data[,responses[[i]]])))
          }
        }
      }
      return(alphas)
    }

抱歉因错误而浪费任何人的时间。从好的方面来说,通过将这个新的Cronbach.Alphas()函数替换为上面的脚本,我现在发布了一个脚本,它将自动识别比例并生成一个cronbach的alpha列表(前提是这些列在下面用下划线命名)缩放名称)对于任何可能感兴趣的人。再次感谢!