返回data.table子集中的额外变量

时间:2016-04-08 05:52:38

标签: r data.table

给出样本data.table

DT<-data.table(c(1:20), LETTERS[1:10], c("w","x","y","z"), rnorm(c(1:20)))

我想根据比如说:

将其分类
DT[, .(V4=max(V4)), by=.(V3)]

返回

   V3        V1
1:  w 1.1939909
2:  x 1.6321958
3:  y 0.5836792
4:  z 0.4115887

我的问题是:如何让它返回一个额外的变量(列),但没有按该列排序?那么,如何在上面的子集中包含适当的V2列来获取:

   V3        V4  V2
1:  w 1.1939909  A
2:  x 1.6321958  F
3:  y 0.5836792  G
4:  z 0.4115887  J

执行此操作:DT[, .(V4=max(V4), V2), by=.(V3)] 或者:DT[, .(V4=max(V4)), by=.(V3, V2)] 只返回整个数据集。

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

我们可以使用.SD根据&#34; V4&#34;的最大值索引对行进行子集化,按&#34; V3&#34;

分组
DT[, .SD[which.max(V4)], by = V3]

order&#34; V4&#34;按&#34; V3&#34;分组并选择第一行

DT[order(-V4), head(.SD, 1) , by = V3]

答案 1 :(得分:2)

如果您要排除原始V1,可以执行以下操作:

DT[ , .(V4[idx <- which.max(V4)], V2[idx]), by = V3]

或者

DT[ , .SD[which.max(V4)], by = V3, .SDcols = c("V2", "V4")]

当我们想做的不仅仅是这个简单的操作时,这两种方法对不同情况都有吸引力。