好的,我已经阅读了这个问题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等) - 但请接受这是怎样的我们在社会科学中做到:-)。标签是调查中的答案,级别是分配给这些答案的整数值。
答案 0 :(得分:4)
您可以将因子变量转换为整数这一事实不是您应该考虑用于分析目的的事情。 R 在内部将因子存储为整数,每个数字对应不同的级别:这比复制每个观察的因子标签更有效。但这些数字并不一定对应于外界有意义的任何数字,默认情况下,它们只是按字母顺序对标签进行排序。
所以是的,您可以通过将因子转换为整数来对算法进行算术运算。这并不意味着你应该这样做。如果您想分析像李克特量表这样的序数数据,请使用为此目的设计的函数。
答案 1 :(得分:4)
其他受访者已经清楚地列出了反对因素算术的案例,但如果这种强制是有意义的(例如通过一些序数解释),那么这个强制到矩阵的代码将会相当紧凑:
> rowSums(data.matrix(sample))
1 2 3 4 5 6
14 12 13 14 11 15
它不会改变sample
的价值。 BTW有一个名为sample
的非常有用的函数,所以如果你在编码时避免使用那个特别的名字会更好。
答案 2 :(得分: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,])))
这样您就不必输入所有列的名称。