我需要创建一个数据框,其变量是另一个数据框的重新编码值。
数据矩阵中有一列由一组评价者和一名专家评价者评分。这是数据结构的样子(这些只是组成值):
person <- c(1:10)
rater.1 <- c(2,3,2,3,4,3,4,2,3,3)
rater.2 <- c(4,3,2,3,1,2,3,2,3,1)
rater.3 <- c(3,2,3,1,2,2,2,3,1,2)
rater.4 <- c(3,4,3,4,3,4,2,2,3,2)
expert.rater <- c(4,4,2,3,1,2,1,2,2,2)
ratings <- data.frame(person,rater.1,rater.2, rater.3, rater.4, expert.rater)
除了我的真实数据集外,我有131个评分者和400个人。
我需要将每个评估者与专家进行比较,并制作差异分数的新数据框。 我可以想到这样做,除非它非常繁琐,可能不是一个好主意:
rater.1_a <- abs(rater.1 - expert.rater)
rater.2_a <- abs(rater.2 - expert.rater)
rater.3_a <- abs(rater.3 - expert.rater)
rater.4_a <- abs(rater.4 - expert.rater)
difference <- data.frame(person,rater.1_a,rater.2_a, rater.3_a, rater.4_a)
有没有更快的方法来创建131个新的rater.x_a变量?
答案 0 :(得分:2)
为什么不呢:
abs(ratings[,2:5] - ratings[,6])
rater.1 rater.2 rater.3 rater.4
1 2 0 1 1
2 1 1 2 0
3 0 0 1 1
4 0 0 2 1
5 3 0 1 2
6 1 0 0 2
7 3 2 1 1
8 0 0 1 0
9 1 1 1 1
10 1 1 0 0
(如果您的数据很大,而且所有数字都是数字,那么使用矩阵而不是数据框执行此操作可能会更快。)
答案 1 :(得分:1)
这将创建一个差异分数矩阵&#39;:
> ToCalc = ratings[,grep("rater\\.", names(ratings))]
> Result = apply(ToCalc, 2, function(X) abs(X - ratings$expert.rater))
rater.1 rater.2 rater.3 rater.4
[1,] 2 0 1 1
[2,] 1 1 2 0
[3,] 0 0 1 1
[4,] 0 0 2 1
[5,] 3 0 1 2
[6,] 1 0 0 2
[7,] 3 2 1 1
[8,] 0 0 1 0
[9,] 1 1 1 1
[10,] 1 1 0 0
然后将格式与第一帧匹配:
Result = data.frame(person=ratings$person, Result, expert.rater=ratings$expert.rater)