[英]How to pass a list of columns to data.table where some are predetermined
[英]How to ungroup list columns in data.table?
這類似於kdb中更多(20x)更快的ungroup函數。
我正在尋找一個類似(但速度更快)的函數,假設data.table包含多個列表列,每個列在每行上具有相同數量的元素,將擴展data.table。
這是這篇文章的延伸。
library(data.table)
library(tidyr)
t = Sys.time()
DT = data.table(a=c(1,2,3),
b=c('q','w','e'),
c=list(rep(t,2),rep(t+1,3),rep(t,0)),
d=list(rep(1,2),rep(20,3),rep(1,0)))
print(DT)
a b c d
1: 1 q 2016-01-09 09:55:14,2016-01-09 09:55:14 1,1
2: 2 w 2016-01-09 09:55:15,2016-01-09 09:55:15,2016-01-09 09:55:15 20,20,20
3: 3 e
print(unnest(DT))
Source: local data frame [5 x 4]
a b c d
(dbl) (chr) (time) (dbl)
1 1 q 2016-01-09 09:55:14 1
2 1 q 2016-01-09 09:55:14 1
3 2 w 2016-01-09 09:55:15 20
4 2 w 2016-01-09 09:55:15 20
5 2 w 2016-01-09 09:55:15 20
這是我自己的嘗試......似乎要快2倍,但應該大大改善......
dtUngroup <- function(DT){
colClasses <- lapply(DT,FUN=class)
listCols <- colnames(DT)[colClasses=='list']
if(length(listCols)>0){
nonListCols <- setdiff(colnames(DT),listCols)
nbListElem <- unlist(DT[,lapply(.SD,FUN=lengths),.SDcols=(listCols[1L])])
DT1 <- DT[,lapply(.SD,FUN=rep,times=(nbListElem)),.SDcols=(nonListCols)]
DT1[,(listCols):=DT[,lapply(.SD,FUN=function(x) do.call('c',x)),.SDcols=(listCols)]]
return(DT1)
}
return(DT)
}
dtUngroup(DT)[]
a b c d
1: 1 q 2016-01-09 09:55:14 1
2: 1 q 2016-01-09 09:55:14 1
3: 2 w 2016-01-09 09:55:15 20
4: 2 w 2016-01-09 09:55:15 20
5: 2 w 2016-01-09 09:55:15 20
使用:
na.omit(DT[, lapply(.SD, unlist), a][, c := as.POSIXct(c, origin="1970-01-01")])
得到:
a b c d
1: 1 q 2016-01-09 12:17:24 1
2: 1 q 2016-01-09 12:17:24 1
3: 2 w 2016-01-09 12:17:25 20
4: 2 w 2016-01-09 12:17:25 20
5: 2 w 2016-01-09 12:17:25 20
如果a
列中的值對於每一行都不是唯一的,則可以使用:
na.omit(DT[, lapply(.SD, unlist), by=1:nrow(DT)][, c := as.POSIXct(c, origin="1970-01-01")])
一個基准測試:
> microbenchmark(dtUngroup(DT)[], jaap())
Unit: milliseconds
expr min lq mean median uq max neval cld
dtUngroup(DT)[] 3.935677 4.005596 4.189208 4.066196 4.227372 6.750338 100 b
jaap() 1.977175 2.039830 2.094536 2.074314 2.132525 2.309848 100 a
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.