设置数据框中多列的因子级别的顺序

时间:2011-02-02 16:32:27

标签: r

我已将CSV文件中的数据加载到数据框中。每列代表一个调查问题,所有答案均采用五点李克特量表,标签为:(“无”,“低”,“中”,“高”,“非常高”)。

当我最初读入数据时,R正确地将这些值解释为因子,但不知道排序应该是什么。我想指定值的排序,以便我可以进行一些数值计算。我认为以下代码可行:

X <- read.csv('..')
likerts <- data.frame(apply(X, 2, function(X){factor(X, 
             levels = c("None", "Low", "Medium", "High", "Very High"), 
             ordered = T)}))

相反,所有级别数据都会转换为字符串。我该如何正确地做到这一点?

2 个答案:

答案 0 :(得分:8)

使用data.frame时,R会再次转换为正常因子(或stringsAsFactors = FALSE转换为字符串)。请改用as.data.frame。玩具数据框的一个简单例子:

X <- data.frame(
  var1=rep(letters[1:5],3),
  var2=rep(letters[1:5],each=3)

)
likerts <- as.data.frame(lapply(X, function(X){ordered(X,
              levels = letters[5:1],labels=letters[5:1])}))

> str(likerts)
'data.frame':   15 obs. of  2 variables:
 $ var1: Ord.factor w/ 5 levels "e"<"d"<"c"<"b"<..: 5 4 3 2 1 5 4 3 2 1 ...
 $ var2: Ord.factor w/ 5 levels "e"<"d"<"c"<"b"<..: 5 5 5 4 4 4 3 3 3 2 ...

在旁注中,ordered()为您提供了有序因子,lapply(X,...)在数据帧的情况下优于apply(X,2,...)

答案 1 :(得分:4)

强制性plyr解决方案(使用上面的Joris示例):

> require(plyr)
> Y <- catcolwise( function(v) ordered(v, levels = letters[5:1]))(X)

> str(Y)
'data.frame':   15 obs. of  2 variables:
 $ var1: Ord.factor w/ 5 levels "e"<"d"<"c"<"b"<..: 5 4 3 2 1 5 4 3 2 1 ...
 $ var2: Ord.factor w/ 5 levels "e"<"d"<"c"<"b"<..: 5 5 5 4 4 4 3 3 3 2 ...

请注意,关于catcolwise的一个好处是,它只会将它应用于作为因子的X列,而将其他列单独使用。要解释发生了什么:catcolwise是一个函数,它将函数作为参数,并返回一个在数据框的因子列上“按列”运算的函数。因此,我们可以分两个阶段想象上述行:fn <- catcolwise(...); Y <- fn(X)。请注意,还有函数colwise(对所有列进行操作)和numcolwise(仅对数字列进行操作)。