R max和数据帧j条件中的第一个

时间:2017-05-03 09:35:21

标签: r

我有一个像这样创建的dt:

set.seed(12048)
CC <- c("A", "A", "A", "B", "B", "C", "A", "B", "D", "D")
PO <- c("PO1", "PO2", "PO3", "PO4", "PO5", "PO6", "PO7", "PO8", "PO9", "PO10")
Rating <- c(1, 3, 3, 2, 4, 2, 1, 2, 0, 3)
dt <- data.table(CC, PO, Rating)

看起来像这样:

    CC   PO Rating
 1:  A  PO1      1
 2:  A  PO2      3
 3:  A  PO3      3
 4:  B  PO4      2
 5:  B  PO5      4
 6:  C  PO6      2
 7:  A  PO7      1
 8:  B  PO8      2
 9:  D  PO9      0
10:  D PO10      3

我的目的是能够找出每个CC的第一个非零评级和最高评级。

这是我的代码

dt[,.(FirstRating=ifelse(length(which(Rating > 0) > 0), .SD[which(Rating > 0)[1]]$Rating, head(.SD, 1)$Rating) , MaxRating=max(Rating)), by="CC"][FirstRating != 0 & MaxRating > FirstRating]

这给了我想要的输出

   CC FirstRating MaxRating
1:  A           1         3
2:  B           2         4

然而,这看起来非常复杂,并且不确定是否有办法使用data.table功能保持简单。有人可以指导我吗?

1 个答案:

答案 0 :(得分:0)

为什么你不想这样看C和D的输出? 这里给出了每个CC的答案,显示了第一个和最高评级。

编辑:Imo有一个更有效的解决方案,可以防止.SD评论和复制数据。

dt[,.(FirstRating = Rating[Rating > 0][1],
      MaxRating = max(Rating)),
   by = CC]
   CC FirstRating MaxRating
1:  A           1         3
2:  B           2         4
3:  C           2         2
4:  D           3         3