我有几位评价者对图片的评分:
data <- as.data.frame(matrix(c(rep(1,6),rep(2,6),rep(1:6,2),
0,2,1,0,1,0,0,0,3,0,0,0),12,3))
colnames(data) <- c("image", "rater", "rating")
print(data)
# image rater rating
# 1 1 1 0
# 2 1 2 2
# 3 1 3 1
# 4 1 4 0
# 5 1 5 1
# 6 1 6 0
# 7 2 1 0
# 8 2 2 0
# 9 2 3 3
# 10 2 4 0
# 11 2 5 0
# 12 2 6 0
我想通过图片聚合(mean
)评分,但仅限于给定图片的评分小于3的情况。否则(=如果有3个零或更多),则聚合评级应为零。零的计数应仅适用于评分者1-5。
所以对于上述数据:
# image rating
# 1 1 0.8
# 2 2 0.0
对于图像1评级是聚合的,因为第三个零属于评估者6.对于图像2,聚合评级为零,因为有超过2个零。
除此之外,我希望聚合考虑到a)每个图像的前5个评级,以及b)只有正评级。
我可以使用aggregate
管理最后两个条件:
aggregate(rating ~ image, data = data[data$rater <= 5 & data$rating != 0,], mean)
# Result:
# image rating
# 1 1 1.333333
# 2 2 3.000000
但我无法弄清楚第一个条件。
正确的结果应该是:
# image rating
# 1 1 1.333333
# 2 2 0.000000
有人可以帮忙吗?感谢。
答案 0 :(得分:1)
这是一个使用基数R的好方法:
data$this <- ave(data$rating, data$image,
FUN=function(i) if(sum(i[1:5] > 0) > 2) mean(i[1:5]) else 0)
我使用i[1:5]
对每个图像进行子集化,因此如果图像的评分少于5个,则会出现错误。如果感兴趣,则返回每个组的平均值。当然,您可以使用相同的函数来生成您提到的聚合表:
aggregate(data$rating, data["image"],
FUN=function(i) if(sum(i[1:5] > 0) > 2) mean(i[1:5]) else 0)