R:在data.table中选择列范围

Ric*_*ard 4 select r range data.table

我正在努力掌握data.table的文档,但是我想请求反馈,我在以下方面的推理中出错了.

(1)我想从data.table中选择一系列列来创建一个新的data.table.

(2)另外,我想取每组的第一个值.关于第一个问题,我认为这里给出了答案,但是关于列号.但我想使用列名,我认为这是data.table的主要优势(和卖点)之一.

这是一个示例数据集.

DT <- data.table(ID=c(101,101,101,102,103,104,104),
                 "year.1" = c(1,5,3,2,3,4,8), 
                 "year.2" = c(4,5,6,NA,1,2,3), 
                 "year.3" = c(1,2,3,7,9,8,0), 
                 "year.4" = c(4,5,NA,1,2,6,9))
setkey(DT,ID)
Run Code Online (Sandbox Code Playgroud)

实际上我有更多的专栏而不仅仅是"年".

# ALL OF THESE DONT WORK AND END IN ERRORS
# To extract a range of columns I have tried this:
dt.sub <- DT[,list(year.1:year.3,ID)]
dt.sub <- DT[,c("year.1":"year.3",ID), with=FALSE] # I know shouldn't work since 
# "with=FALSE" is only intended in combination with := according to the documentation
dt.sub <- DT[,lapply(SD),.SDcols= for (i in 1:3) paste0("year.",i) ]
Run Code Online (Sandbox Code Playgroud)

对于第二个问题:如果我希望dt.sub仅包含每个组的第一个观察,我希望我可以使用"mult"参数.然而,这也与我预期的方式不同.仅在一列上使用该示例:

dt.sub1 <- DT[,year.1, by=ID,mult="first",]
Run Code Online (Sandbox Code Playgroud)

这不会产生错误,但也不会只提供组的第一行.我知道一个解决方法,如:

dt.sub1 <- unique(DT[,year.1, by=ID])
Run Code Online (Sandbox Code Playgroud)

确实提供了预期的输出,但我觉得我错过了一些重要的mult选项.

edd*_*ddi 7

# (1)
DT[, c(paste0('year.', 1:3), 'ID'), with = F]

# (2) 
DT[, year.1[1], by = ID]
Run Code Online (Sandbox Code Playgroud)

mult使用时,合并/加入 2个data.tables并且表示当多个匹配存在做什么.因此,正如@Arun指出的那样,mult第二个问题的使用方法是(鉴于你已经被键入ID):

DT[J(unique(ID)), list(ID, year.1), mult = 'first']
Run Code Online (Sandbox Code Playgroud)