【问题标题】:R: Aggregate dataframe if column has less than 3 zeros, else return zeroR:如果列少于 3 个零,则聚合数据框,否则返回零
【发布时间】:2016-08-17 09:39:07
【问题描述】:

我有几个评分者对图像的评分:

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

有人可以帮忙吗?谢谢。

【问题讨论】:

  • 也许可以试试library(data.table) ; setDT(data)[, if(sum(rating[rater &lt; 6] == 0) &gt; 2) 0 else mean(rating[rating != 0]), by = image]。或library(dplyr) ; data %&gt;% group_by(image) %&gt;% summarise(rating = ifelse(sum(rating[rater &lt; 6] == 0) &gt; 2, 0, mean(rating[rating != 0])))。无论你喜欢什么香草。
  • @DavidArenburg 本着扩大基础 R 使用的精神查看我的回答。 :)

标签: r dataframe aggregate mean


【解决方案1】:

这是一个使用 base 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)

【讨论】:

    猜你喜欢
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多