2017-05-02 40 views
1

我有表示从PO创建过程的反馈一些杂乱数据数据表争论

PO <- c(1, 1, 2, 2, 3, 4, 5, 6) 
Rating <- c(3, 0, 0, 1, 3, 4, 5, 4) 
dt <- data.table(PO, Rating) 

> dt 
    PO Rating 
1: 1  3 
2: 1  0 
3: 2  0 
4: 2  1 
5: 3  3 
6: 4  4 
7: 5  5 
8: 6  4 

PO#1具有3两个评级和0,和PO#2具有的0和1的评价在所有这种情况下,我想换行到最大为该PO

PO Rating 
1: 1  3 
2: 1  3 <- changed from 0 
3: 2  1 <- changed from 0 
4: 2  1 
5: 3  3 
6: 4  4 
7: 5  5 
8: 6  4 

第一步是检测有这个问题的采购订单。我对此有以下R代码:

t <- dt[, .(U=length(unique(Rating))), by=.(PO)] 

> t 
    PO U 
1: 1 2 
2: 2 2 
3: 3 1 
4: 4 1 
5: 5 1 
6: 6 1 

这表明PO#1和#2有两个唯一的评级。现在,我的任务是找到这些唯一评分的最大值,并将它们分配回数据表dt。

如何在R中执行此操作?

+2

这样吗? 'dt [,Rating:= max(Rating,na.rm = TRUE),by = PO]' – din

+1

是的,它运作良好。请给出答案,我会标记它。非常感谢 – user3701522

+1

请注意:'data.table'对'length(unique ...':'uniqueN')有自己的(优化的)函数。 – Jaap

回答

2

使用data.table功能:

# subset by PO, then find the max Rating in each group, and reassign 
# that max value to the Rating 
dt[ , Rating := max(Rating, na.rm = TRUE), by = PO] 

干杯!

1

我们也order,然后可以分配的第一要素

dt[order(PO, -Rating), Rating := Rating[1], PO] 
dt 
# PO Rating 
#1: 1  3 
#2: 1  3 
#3: 2  1 
#4: 2  1 
#5: 3  3 
#6: 4  4 
#7: 5  5 
#8: 6  4 
+1

谢谢。 – user3701522