2

好的,我已经阅读了这个问题Confusion between factor levels and factor labels。但还是觉得自己错过了很多。所以这本身可能不是一个问题——更像是我沮丧的表现。

样本数据

sample <- dput(structure(list(Logistik_1 = structure(c(3L, 2L, 3L, 3L, 3L, 4L), .Label = c("I meget ringe grad", "I ringe grad", "I nogen grad", "I høj grad", "I meget høj grad"), class = "factor"),
                              Logistik_2 = structure(c(4L, 4L, 4L, 3L, 3L, 4L), .Label = c("I meget ringe grad", "I ringe grad", "I nogen grad", "I høj grad", "I meget høj grad"), class = "factor"),
                              Logistik_3 = structure(c(3L, 4L, 3L, 4L, 3L, 4L), .Label = c("I meget ringe grad", "I ringe grad", "I nogen grad", "I høj grad", "I meget høj grad"), class = "factor"),
                              Logistik_4 = structure(c(4L, 2L, 3L, 4L, 2L, 3L), .Label = c("I meget ringe grad", "I ringe grad", "I nogen grad", "I høj grad", "I meget høj grad"), class = "factor")),
                         .Names = c("Logistik_1","Logistik_2", "Logistik_3", "Logistik_4"), row.names = c(NA, 6L), class = "data.frame"))

的输出sample显示了标签。

    Logistik_1   Logistik_2   Logistik_3   Logistik_4
1 I nogen grad   I høj grad I nogen grad   I høj grad
2 I ringe grad   I høj grad   I høj grad I ringe grad
3 I nogen grad   I høj grad I nogen grad I nogen grad
4 I nogen grad I nogen grad   I høj grad   I høj grad
5 I nogen grad I nogen grad I nogen grad I ringe grad
6   I høj grad   I høj grad   I høj grad I nogen grad

我无法用这些名义数据进行计算rowSums(sample)

Error in rowSums(sample) : 'x' must be numeric

我可以将每个变量更改为数字。例如,如果我想添加所有整数值,我可以这样做:sample$test <- as.numeric(sample[[1]])+as.numeric(sample[[2]])+as.numeric(sample[[3]])+as.numeric(sample[[4]])这会起作用。但我认为它的打字量很大?

但是:如果我 cbind 列,输出将返回级别: 输出with(sample, cbind(Logistik_1, Logistik_2))

     Logistik_1 Logistik_2
[1,]          3          4
[2,]          2          4
[3,]          3          4
[4,]          3          3
[5,]          3          3
[6,]          4          4

我可以在这些层面上进行计算。例如,如果我想添加所有整数值,我可以这样做:sample$total_score <-with(sample, rowSums(cbind(Logistik_1, Logistik_2, Logistik_3, Logistik_4)))[a]

    Logistik_1   Logistik_2   Logistik_3   Logistik_4 total_score
1 I nogen grad   I høj grad I nogen grad   I høj grad          14
2 I ringe grad   I høj grad   I høj grad I ringe grad          12
3 I nogen grad   I høj grad I nogen grad I nogen grad          13
4 I nogen grad I nogen grad   I høj grad   I høj grad          14
5 I nogen grad I nogen grad I nogen grad I ringe grad          11
6   I høj grad   I høj grad   I høj grad I nogen grad          15

但我很困惑,并认为我正在做一些简单太复杂的事情。是否有规范的“正确”方法来计算因子水平?as.numeric比 更正确吗cbind?为什么 cbind 一开始就这样工作?

我希望这样的事情会奏效:sum(as.numeric(sample[1:4]))- 但它会返回Error: (list) object cannot be coerced to type 'double'(因为我在数据帧上调用 as.numeric )。

[a] 我知道大多数统计学家会不赞成将整数值分配给调查响应的常见做法(例如,“非常同意”=5、“有点同意”=4 等)——但请接受我们就是这样做的在社会科学中:-)。标签是调查中的响应,级别是分配给这些响应的整数值。

4

3 回答 3

4

其他受访者已明确提出反对对因子进行算术运算的情况,但如果这种强制是有意义的(例如通过一些序数解释),那么强制转换为矩阵的代码将相当紧凑:

> rowSums(data.matrix(sample))
 1  2  3  4  5  6 
14 12 13 14 11 15 

它不会改变 的值sample。顺便说一句,有一个非常有用的函数命名sample,因此如果您在编码时避免使用该特定名称会更好。

于 2013-08-01T15:12:45.683 回答
4

您可以将因子变量转换为整数这一事实不应该被认为对分析有用。R在内部因子存储为整数,每个数字对应于不同的级别:这比为每个观察复制因子标签更有效。但这些数字不一定对应于外部世界中有意义的任何东西,默认情况下,它们只是通过按字母顺序对标签进行排序来分配的。

所以是的,您可以通过将因子转换为整数来进行算术运算。这并不意味着你应该这样做。如果您想分析像李克特量表这样的有序数据,请使用为此目的设计的函数。

于 2013-08-01T14:28:15.253 回答
3

理论是,如果您将某些东西作为一个因素存储,那么您就不想对其进行计算!添加数字是什么意思?为什么“非常同意”+“既不同意也不反对”等于 8?


代替

sample$total_score <-with(sample, rowSums(cbind(Logistik_1, Logistik_2, Logistik_3, Logistik_4)))

你可能更喜欢使用类似的东西

sample$total_score <- sapply(1:nrow(sample),function(n) sum(as.numeric(sample[n,])))

这样您就不必键入所有列的名称。

于 2013-08-01T14:39:53.213 回答