R:使用data.table和self-join的组首次观察

前端之家收集整理的这篇文章主要介绍了R:使用data.table和self-join的组首次观察前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图通过一组三个变量使用data.table来获取顶行.

我有一个工作的解决方案:

col1 <- c(1,1,2,3,3)
col2 <- c(2000,2000,2001,2001)
col4 <- c(1,4,5,6,7,8,9,10,11,12)
data <- data.frame(store=col1,year=col2,month=12,sales=col4)

solution1 <- data.table(data)[,.SD[1,],by="store,year,month"]

我使用Matthew Dowle建议的较慢的方法在以下链接中:

https://stats.stackexchange.com/questions/7884/fast-ways-in-r-to-get-the-first-row-of-a-data-frame-grouped-by-an-identifier

我试图实现更快的自我加入,但不能让它上班.

有没有人有什么建议?

解决方法

选项1(使用键)

设置要存储的关键,年,月

DT <- data.table(data,key = c('store','year','month'))

然后,您可以使用unique创建一个包含键列的唯一值的data.table.默认情况下,这将占用第一个条目

unique(DT)
   store year month sales
1:     1 2000    12     1
2:     1 2001    12     3
3:     2 2000    12     5
4:     2 2001    12     7
5:     3 2000    12     9
6:     3 2001    12    11

但是,可以肯定的是,您可以使用mult =’first’的自联接. (其他选项是“全部”或“最后”)

# the key(DT) subsets the key columns only,so you don't end up with two 
# sales columns
DT[unique(DT[,key(DT),with = FALSE]),mult = 'first']

选项2(无键)

没有设置密钥,使用起来会更快.我不是.SD

DTb <- data.table(data)
DTb[DTb[,list(row1 = .I[1]),by = list(store,month)][,row1]]

猜你在找的MsSQL相关文章