R数据表“by”用于“i”

4
在给定的数据表中,如何选择V3分组的V2 = max(V2)的列V1的语法。
例如: 在mtcars数据集中,我想找出与max(disp)相等的观测值相对应的hp,按cyl分组。
以下是我的不优雅的解决方案,使用which:
mtcars <- data.table(mtcars)
mtcars[which(mtcars$disp %in% mtcars[, max(disp), by = .(cyl)]$V1), .(cyl,hp)]
   cyl  hp
1:   6 110
2:   4  62
3:   8 205

有没有更多“data.table”方式实现相同的结果?

1
还可以在这里看一下:https://dev59.com/1WQn5IYBdhLWcg3wxZni - talat
3个回答

7
我们可以尝试使用“join”函数。
mtcars[mtcars[, list(disp=max(disp)), by = cyl], 
    on = c('cyl', 'disp')][, c('cyl', 'hp'), with=FALSE]
#   cyl  hp
#1:   6 110
#2:   4  62
#3:   8 205

这里有一个更简短的方法可以得到期望的输出。

mtcars[, .SD[disp==max(disp), .(hp)], by = cyl]
#   cyl  hp
#1:   6 110
#2:   4  62
#3:   8 205

7
您可以使用.I
mtcars[mtcars[, .I[which.max(disp)], by = cyl]$V1, .(cyl, hp)]
#   cyl  hp
#1:   6 110
#2:   4  62
#3:   8 205

或者

mtcars[, hp[disp == max(disp)], by=cyl]
#   cyl  V1
#1:   6 110
#2:   4  62
#3:   8 205

你可以稍微简化自己的方法:

mtcars[disp %in% mtcars[, max(disp), by = .(cyl)]$V1, .(cyl,hp)]

2
mtcars[,ismax:=disp==max(disp),by=cyl][ismax==T, .(cyl, hp)]
   cyl  hp
1:   6 110
2:   4  62
3:   8 205

我总是得到和其他人几乎完全相同的解决方案。哎,算了...

mtcars[,.SD[disp == max(disp)], by = cyl, .SDcols = c("disp", "hp")][,.(cyl, hp)]

该方法在原始数据中不必要地创建了新列。 - akrun
1
好的,这个确实看起来是一个简短而容易的解决方案。让我想一想如何在不创建新列的情况下产生相同的输出。 - statespace

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接