R:如果列少于3个零则聚合数据帧,否则返回零

时间:2016-04-23 20:40:22

标签: r dataframe aggregate mean

我有几位评价者对图片的评分:

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

有人可以帮忙吗?感谢。

1 个答案:

答案 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)