我在工作中要处理大量的调查数据等,而且我经常不得不制作各种逐行处理数据的评分程序。例如,我现在正在处理一个包含 12 列的表格,其中包含来自心理测量仪器的子量表分数。这些将使用仪器创建者提供的表格转换为标准化分数。到目前为止看起来很简单。
但是,有四张表 - 根据性别和年龄范围,该乐器的评分不同。因此,例如,一个 14 岁的女性和一个 10 岁的男性得到不同的标准化表。所有归一化数据都存储在 R 数据帧中。
我想做的是编写一个可以应用于行的函数,它返回一个从规范化数据中查找的向量。所以,有点像这样:
converter <- function(rawscores,gender,age) {
if(gender=="Male") {
if(8 <= age & age <= 11) {convertvec <- c(1:12)}
if(12 <= age & age <= 14) {convertvec <- c(13:24)}
}
else if(gender=="Female") {
if(8 <= age & age <= 11) {convertvec <- c(25:36)}
if(12 <= age & age <= 14) {convertvec <- c(37:48)}
}
converted_scores <- rep(0,12)
for(z in 1:12) {
converted_scores[z] <- conversion_table[(unlist(rawscores)+1)[z],
convertvec[z]]
}
rm(z)
return(converted_scores)
}
编辑:我用昨天实际工作的代码更新了这个。这个版本返回一个带有分数的简单向量。下面是我如何实现它。
mydata[,21:32] <- 0
for(x in 1:dim(mydata)[1]) {
tscc_scores[x,21:32] <- converter(mydata[x,7:18],
mydata[x,"gender"],
mydata[x,"age"])
}
这行得通,但就像我说的,我明白这是不好的做法?
旁注: rawscores+1 的原因是数据框在第一个索引中的得分为零。
从根本上说,这个函数看起来并不复杂,我知道我可以使用一个循环来实现它,我会在其中执行 for(x in 1:number_of_records),但我的理解是这样做是不好的做法。我曾希望简单地使用 apply() 来执行此操作,如下所示:
apply(X=mydata[,1:12],MARGIN=1,
FUN=converter,gender=mydata[,"gender"],age=mydata[,"age"])
不幸的是,R 似乎不赞成这种方法,因为它不会遍历传递给后续参数的向量,而是尝试将它们作为一个整体的参数。解决方案似乎是 mapply(),但我不知道是否有办法在行而不是列上使用 mapply()。
所以,我想我的问题是三方面的。一,有没有办法在行上使用 mapply() ?二,有没有办法让 apply() 迭代参数?第三,有更好的选择吗?我已经看到并听到了很多关于 plyr 包的信息,但在我完全研究 Base R 中存在的选项之前,我不想跳到那个。