给出样本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)]
只返回整个数据集。
感谢您的帮助
答案 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")]
当我们想做的不仅仅是这个简单的操作时,这两种方法对不同情况都有吸引力。