我已将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)}))
相反,所有级别数据都会转换为字符串。我该如何正确地做到这一点?
答案 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
(仅对数字列进行操作)。