【发布时间】:2023-03-12 20:40:02
【问题描述】:
我正在努力掌握 data.table 的文档,但我想征求反馈意见,我在以下方面的推理中哪里出错了。
(1) 我想从 data.table 中选择一系列列来创建一个新的 data.table。
(2) 另外,我想只取每组的第一个值。关于第一个问题,我认为答案是here,然后是关于列号。但我想使用列名,我认为这是 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)
实际上我有更多的专栏,而不仅仅是“年”。
# 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) ]
对于第二个问题:如果我希望 dt.sub 仅包含每个组的第一个观察结果,我希望我可以使用“mult”参数。然而,这也适用于 与我预期不同的方式。仅在一列上使用示例:
dt.sub1 <- DT[,year.1, by=ID,mult="first",]
这没有提供错误,但也不仅仅给出了组的第一行。我知道这样的解决方法:
dt.sub1 <- unique(DT[,year.1, by=ID])
确实提供了预期的输出,但我觉得mult 选项缺少一些重要的东西。
【问题讨论】:
-
您好 Arun,感谢您的编辑,这样更清楚了!
-
因为
v1.9.5这应该可以工作:dt.sub <- DT[,c("year.1":"year.3",ID), with=FALSE]。见here。
标签: r select range data.table