16

我正在尝试使用 data.table 通过一组三个变量来获取第一行。

我有一个可行的解决方案:

col1 <- c(1,1,1,1,2,2,2,2,3,3,3,3)
col2 <- c(2000,2000,2001,2001,2000,2000,2001,2001,2000,2000,2001,2001)
col4 <- c(1,2,3,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

我正在尝试实现更快的自我加入,但无法使其正常工作。

有没有人有什么建议?

4

2 回答 2

23

选项 1(使用密钥)

将密钥设置为store, year, month

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'. (其他选项是'all''last'

# 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(无键)

.I 不设置key,使用not会更快.SD

DTb <- data.table(data)
DTb[DTb[,list(row1 = .I[1]), by = list(store, year, month)][,row1]]
于 2013-04-02T23:19:32.060 回答
3

关于什么:

solution2 <- data.table(data)[ , sales[1], by="store,year,month"]
> solution2
   store year month V1
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

我想您可以重命名该列:

data.table(data)[,fsales := sales[1],by="store,year,month"]
于 2013-04-02T23:22:57.047 回答