R 在data.table中结合tail和by

R 在data.table中结合tail和by,r,data.table,R,Data.table,通过因子获取data.table尾行的最佳方法是什么 假设我有: > dt <- data.table(category = c("A", "A", "B", "B", "B"), value = c(1,2,3,4,5)) > dt category value 1: A 1 2: A 2 3: B 3 4: B 4 5: B 5 我们可以使用last dt

通过因子获取data.table尾行的最佳方法是什么

假设我有:

> dt <- data.table(category = c("A", "A", "B", "B", "B"), value = c(1,2,3,4,5))
> dt
   category value
1:        A     1
2:        A     2
3:        B     3
4:        B     4
5:        B     5

我们可以使用
last

 dt[,list(value=last(value)) , by = category]
 #     category value
 #1:        A     2
 #2:        B     5
如果有很多列

dt[, lapply(.SD, last), category]

如果数据按“类别”排序,则为另一选项

dt[!duplicated(category, fromLast=TRUE)]
#    category value
#1:        A     2
#2:        B     5
或者像@Frank提到的那样

unique(dt, by="category", fromLast=TRUE)
或者我们可以直接在
.SD
上使用
last
(如评论中提到的@jangorecki)


dplyr
中还有另一个
last
函数。因此,如果两个包都已加载,则最好指定
data.table::last
,这样它就不会被屏蔽。

dt[,lapply(.SD,tail,1),by=category]
dt[,value[.N],by=category]
,以防有更多的列要返回,即不仅仅是
value
列+任何分组列,您可以使用
dt[dt[,max(.I),by=category]$V1]
,这将非常有用efficient@Frank谢谢,没有检查
unique
是否也有
fromLast
参数。那么
dt[,last(.SD),category]
呢?乍一看也应该是有效的。
unique(dt, by="category", fromLast=TRUE)
dt[, last(.SD), category]