Psych alpha() 函数在输入 dplyr 结果时出错
Psych alpha() function giving error when fed dplyr results
我有一个大型数据集,我正试图 trim 向下聚焦。作为其中的一部分,我有三个变量,它们被测量了五次。我把每次都变成一个平均值,所以我最终得到了五个变量(每次一个),我想找到它们的内部一致性。当我尝试使用 psych::alpha()
计算 Cronbach 的 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
抛出这个错误?
经过一些探索后,我找到了一种方法来完成这项工作。它涉及 dplyr
输出在 data.frame
之外还有额外的 classes。我使用以下代码以不同的方式创建了均值列以远离 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)
命令运行良好。这启发了我去检查一些关于数据框的事情。
我原来的post的df1
的class和这里的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))
起作用并产生相同的结果。这里有两种解决方案:
- 使用非
dplyr
方法获取平均数据。这将数据保存为 data.frame classed 对象。
- 当运行使用
alpha()
函数时,使用as.data.frame()
强制对象进入class右边。或将 %>% as.data.frame()
添加到 dplyr
mutate 命令的末尾。
我有一个大型数据集,我正试图 trim 向下聚焦。作为其中的一部分,我有三个变量,它们被测量了五次。我把每次都变成一个平均值,所以我最终得到了五个变量(每次一个),我想找到它们的内部一致性。当我尝试使用 psych::alpha()
计算 Cronbach 的 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
抛出这个错误?
经过一些探索后,我找到了一种方法来完成这项工作。它涉及 dplyr
输出在 data.frame
之外还有额外的 classes。我使用以下代码以不同的方式创建了均值列以远离 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)
命令运行良好。这启发了我去检查一些关于数据框的事情。
我原来的post的df1
的class和这里的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))
起作用并产生相同的结果。这里有两种解决方案:
- 使用非
dplyr
方法获取平均数据。这将数据保存为 data.frame classed 对象。 - 当运行使用
alpha()
函数时,使用as.data.frame()
强制对象进入class右边。或将%>% as.data.frame()
添加到dplyr
mutate 命令的末尾。