我有一个像这样创建的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功能保持简单。有人可以指导我吗?
答案 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