从评分键中重新计算项目

时间:2014-10-02 00:05:22

标签: r plyr scoring

我有一组数据,其中受访者被给予一系列问题,每个问题有五个响应选项(例如,1:5)。鉴于这五个选项,我对每个问题都有一个得分密钥,其中一些回答值得满分(例如2),其他一半得分(1),其他回答没有积分(0)。因此,数据框是n(人)x k(问题),评分密钥是k(问题)x m(响应)矩阵。

我要做的是以编程方式创建已重新分类项目的新数据集。普通数据集:

x <- sample(c(1:5), 50, replace = TRUE)
y <- sample(c(1:5), 50, replace = TRUE)
z <- sample(c(1:5), 50, replace = TRUE)
dat <- data.frame(cbind(x,y,z)) # 3 items, 50 observations (5 options per item)
head(dat)
  x y z
1 3 1 2
2 2 1 3
3 5 3 4
4 1 4 5
5 1 3 4
6 4 5 4

# Each option is scored 0, 1, or 2:
key <- matrix(sample(c(0,0,1,1,2), size = 15, replace = TRUE), ncol=5)
key
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    1    2
[2,]    2    1    1    1    2
[3,]    2    2    1    1    2

3 个答案:

答案 0 :(得分:3)

其他一些选项,首先使用Map

data.frame(Map( function(x,y)  key[y,x], dat, seq_along(dat) ))

#  x y z
#1 0 2 2
#2 0 2 1
#3 2 1 1
#4 0 1 2
#5 0 1 1
#6 1 2 1

其次在key上使用矩阵索引:

newdat <- dat
newdat[] <- key[cbind( as.vector(col(dat)), unlist(dat) )]
newdat

#  x y z
#1 0 2 2
#2 0 2 1
#3 2 1 1
#4 0 1 2
#5 0 1 1
#6 1 2 1

如果您将key指定为list

,情况会更简单
key <- list(x=c(0,0,0,1,2),y=c(2,1,1,1,2),z=c(2,2,1,1,2))
data.frame(Map("[",key,dat))

#  x y z
#1 0 2 2
#2 0 2 1
#3 2 1 1
#4 0 1 2
#5 0 1 1
#6 1 2 1

答案 1 :(得分:1)

对于后人,我和一位朋友讨论了这个问题,他建议采用另一种方法。这样做的好处是它仍然使用mapvalues()来进行重新分析,但不需要for循环,而是使用&#34;来自&#34;在sapply中进行索引。

library(plyr)
scored <- sapply(1:ncol(raw), function(x, dat, key){
  mapvalues(dat[,x], from = 1:ncol(key), to = key[x,])    
}, dat = dat, key = key)

答案 2 :(得分:0)

我目前的工作方法是使用1 mapvalues,它位于package:plyr内以完成繁重的工作:它需要修改一个数据向量,以及另外两个参数&#34;来自& #34;,这是原始数据(这里是1:5),&#34;到&#34;,或者我们想要将数据转换成什么; 2)带有索引表示法的for循环,我们循环查看可用的问题,使用当前循环值提取与每个相关的向量,并使用它从我们的评分键中选择正确的行。 / p>

library(plyr)
newdat <- matrix(data=NA, nrow=nrow(dat), ncol=ncol(dat))
for (i in 1:3) {
    newdat[,i] <- mapvalues(dat[,i], from = c(1,2,3,4,5), 
                            to = c(key[i,1], key[i,2], key[i,3], key[i,4], key[i,5]))
}
head(newdat)
     [,1] [,2] [,3]
[1,]    0    2    2
[2,]    0    2    1
[3,]    2    1    1
[4,]    0    1    2
[5,]    0    1    1
[6,]    1    2    1

我对这个解决方案非常满意,但如果有人有更好的方法,我很乐意看到它们!