2016-04-23 70 views
0

我幾個評價者有圖像的評級:R:如果列有少於3個零聚合數據幀,否則返回零

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分的評分被聚集,因爲第三零屬於RATER 6.對於圖像2,聚集評級是零,因爲有超過2個0。最重要的是,我希望聚合考慮到a)每張圖片只有前5個評分,以及b)只有正面評分。

我可以使用aggregate管理的最後2個條件:

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

嘗試類似'library(data.table); setDT(data)[,if(sum(rating [rater < 6] == 0) > 2)0 else mean(rating [rating!= 0]),by = image]'maybe。或者library(dplyr); data%>%group_by(image )%>%summary(rating = ifelse(sum(rating(評分[評價者] < 6] == 0) > 2,0,平均評分[評分!= 0]))''不管你喜歡什麼香草。 –

+0

@DavidArenburg請看我的回答。基地R使用。:) – lmo

回答

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)