Функция Psych alpha () выдает ошибку при загрузке результатов dplyr

У меня есть большой набор данных, который я пытаюсь сократить, чтобы сфокусироваться. В его рамках у меня есть три переменных, которые измеряются пять раз. Я превращал каждый раз в среднее значение, поэтому в итоге я получал пять переменных (по одной на каждый раз), для которых я хочу найти внутреннюю согласованность. Когда я пытаюсь вычислить альфу Кронбаха с помощью psych::alpha(), я получаю сообщение об ошибке.

25 строк воспроизводимых данных:

structure(list(catme_satis1a = c(4L, 4L, 5L, 5L, 5L, NA, 1L, 
4L, 4L, 4L, 4L, 2L, 4L, 4L, 3L, 4L, 4L, 5L, 3L, 4L, 5L, 3L, 4L, 
4L, 5L), catme_satis1b = c(4L, 4L, 4L, 5L, 5L, NA, 1L, 4L, 5L, 
5L, 4L, 2L, 5L, 4L, 3L, 4L, 4L, 5L, 3L, 4L, 5L, 3L, 4L, 4L, 5L
), catme_satis1c = c(3L, 4L, 5L, 5L, 5L, NA, 1L, 4L, 3L, 4L, 
4L, 2L, 4L, 5L, 3L, 4L, 4L, 5L, 3L, 4L, 5L, 3L, 4L, 4L, 5L), 
    catme_satis2a = c(4L, 4L, 4L, 5L, 5L, NA, 5L, 4L, 5L, NA, 
    NA, 3L, NA, 4L, 3L, 4L, 4L, 5L, 3L, NA, 5L, 5L, 4L, 4L, 5L
    ), catme_satis2b = c(4L, 4L, 5L, 5L, 5L, NA, 5L, 4L, 5L, 
    NA, NA, 3L, NA, 4L, 3L, 4L, 3L, 5L, 2L, NA, 5L, 5L, 4L, 4L, 
    5L), catme_satis2c = c(4L, 4L, 5L, 5L, 5L, NA, 5L, 4L, 5L, 
    NA, NA, 3L, NA, 4L, 3L, 4L, 3L, 5L, 3L, NA, 5L, 5L, 4L, 4L, 
    5L), catme_satis3a = c(4L, 4L, 4L, 5L, 5L, 5L, 4L, 4L, 5L, 
    5L, 3L, NA, 3L, 4L, 3L, NA, 4L, 5L, 3L, 5L, 5L, 5L, 4L, 5L, 
    5L), catme_satis3b = c(4L, 4L, 4L, 5L, 5L, 5L, 3L, 4L, 5L, 
    5L, 3L, NA, 3L, 4L, 3L, NA, 4L, 5L, 3L, 5L, 5L, 5L, 4L, 5L, 
    5L), catme_satis3c = c(4L, 5L, 5L, 5L, 5L, 4L, 4L, 4L, 5L, 
    5L, 3L, NA, 3L, 4L, 3L, NA, 4L, 5L, 4L, 5L, 5L, 5L, 4L, 4L, 
    5L), catme_satis4a = c(4L, 5L, 5L, 5L, 5L, 5L, 4L, 4L, 5L, 
    4L, 3L, 3L, 3L, 4L, 3L, 4L, 4L, 4L, 4L, NA, 5L, 5L, 5L, 5L, 
    5L), catme_satis4b = c(4L, 4L, 5L, 5L, 5L, 4L, 4L, 4L, 5L, 
    4L, 3L, 3L, 2L, 4L, 3L, 4L, 5L, 5L, 4L, NA, 5L, 5L, 5L, 5L, 
    5L), catme_satis4c = c(4L, 4L, 5L, 5L, 5L, 4L, 4L, 4L, 5L, 
    3L, 3L, 3L, 2L, 4L, 3L, 5L, 4L, 4L, 4L, NA, 5L, 5L, 5L, 5L, 
    5L), catme_satis5a = c(5L, 4L, 5L, 5L, 5L, 5L, 5L, 4L, 5L, 
    4L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 5L, 4L, 5L, 5L, 1L, 5L, 
    5L), catme_satis5b = c(5L, 4L, 5L, 5L, 5L, 5L, 5L, 4L, 5L, 
    4L, 3L, 3L, 3L, 4L, 4L, 5L, 4L, 5L, 5L, 4L, 5L, 5L, 1L, 5L, 
    5L), catme_satis5c = c(5L, 4L, 5L, 5L, 5L, 5L, 5L, 4L, 5L, 
    4L, 3L, 3L, 2L, 4L, 4L, 5L, 4L, 3L, 5L, 4L, 5L, 5L, 1L, 5L, 
    5L)), class = "data.frame", row.names = c(NA, -25L), .Names = c("catme_satis1a", 
"catme_satis1b", "catme_satis1c", "catme_satis2a", "catme_satis2b", 
"catme_satis2c", "catme_satis3a", "catme_satis3b", "catme_satis3c", 
"catme_satis4a", "catme_satis4b", "catme_satis4c", "catme_satis5a", 
"catme_satis5b", "catme_satis5c"))

Затем я попытался получить среднее значение для столбцов 1: 3, 4: 6 и т. Д. (Но по имени):

library(dplyr)
df1 <- test %>%
  rowwise() %>%
  transmute(catme_satis1 = mean(c(catme_satis1a, catme_satis1b, catme_satis1c)),
            catme_satis2 = mean(c(catme_satis2a, catme_satis2b, catme_satis2c)),
            catme_satis3 = mean(c(catme_satis3a, catme_satis3b, catme_satis3c)),
            catme_satis4 = mean(c(catme_satis4a, catme_satis4b, catme_satis4c)),
            catme_satis5 = mean(c(catme_satis5a, catme_satis5b, catme_satis5c)))

Наконец, я хочу узнать согласованность этих переменных с помощью пакета psych:

library(psych)
alpha(df1)

Что дает эту ошибку:

> alpha(df1)
Error in sort.list(y) : 'x' must be atomic for 'sort.list'
Have you called 'sort' on a list?

Мой фрейм данных кажется правильным, когда я его распечатываю, и я должен быть в состоянии получить согласованность этих значений. Почему r выдает эту ошибку?


person Andrew Jackson    schedule 09.12.2015    source источник
comment
Попробуйте alpha(as.data.frame(df1)). alpha ожидает data.frame или matrix. class(df1) равно "rowwise_df" "tbl_df" "tbl" "data.frame".   -  person    schedule 09.12.2015
comment
После некоторого исследования я понял это и собирался ответить на свой вопрос. Вы меня прямо в середине моих постов!   -  person Andrew Jackson    schedule 09.12.2015


Ответы (1)


После некоторых исследований я нашел способ заставить эту работу работать. Он включает в себя dplyr выход, имеющий дополнительные классы помимо data.frame. Я создал средние столбцы другим способом, чтобы объекты не попадали в dplyr, используя следующий код (обратите внимание, что он называется df2, чтобы облегчить сравнение позже):

df2 <- data.frame(
  catme_satis1 = apply(test[, 1:3], 1, mean),
  catme_satis2 = apply(test[, 4:6], 1, mean),
  catme_satis3 = apply(test[, 7:9], 1, mean),
  catme_satis4 = apply(test[, 10:12], 1, mean),
  catme_satis5 = apply(test[, 13:15], 1, mean)
)

Команда alpha(df2) работала нормально. Это вдохновило меня проверить несколько вещей о фреймах данных. Класс df1 из моего исходного сообщения и df2 здесь другой:

> class(df1)
[1] "rowwise_df" "tbl_df"     "tbl"        "data.frame"
> class(df2)
[1] "data.frame"

Кроме того, они признали полностью идентичными , если я не принудительно превращаю вывод dplyr в фрейм данных!

> identical(df1, df2)
[1] FALSE
> identical(as.data.frame(df1), df2)
[1] TRUE

Выполнение команды alpha(as.data.frame(df1)) работает и дает идентичные результаты. Здесь есть два решения:

  1. Используйте методы, отличные от dplyr, чтобы получить средние данные. Это сохраняет данные как объект класса data.frame.
  2. Используйте as.data.frame() для принуждения объекта к правильному классу при запуске функции alpha(). Или добавьте %>% as.data.frame() в конец команды dplyr mutate.
person Andrew Jackson    schedule 09.12.2015