Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何取消data.table中列表列的分组?_R_Data.table_Kdb_Tidyr - Fatal编程技术网

R 如何取消data.table中列表列的分组?

R 如何取消data.table中列表列的分组?,r,data.table,kdb,tidyr,R,Data.table,Kdb,Tidyr,提供帮助展开列表列的函数 这类似于kdb中快得多(20倍)的函数 我正在寻找一个类似(但速度要快得多)的函数,假设data.table包含多个列表列,每一行上的元素数量都相同,则该函数将扩展data.table 这是一个扩展 这是我自己的尝试。。。这似乎快了2倍,但应该大大改进 dtUngroup <- function(DT){ colClasses <- lapply(DT,FUN=class) listCols <- colnames(DT)[colClasses

提供帮助展开列表列的函数

这类似于kdb中快得多(20倍)的函数

我正在寻找一个类似(但速度要快得多)的函数,假设data.table包含多个列表列,每一行上的元素数量都相同,则该函数将扩展data.table

这是一个扩展

这是我自己的尝试。。。这似乎快了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
dtUngroup使用:

给出:

   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")])
基准RCK:

> 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 

好吧,我不想让你失望。。。请随意起草一个答案……您可以使用:
DT[,lappy(.SD,unlist),by=1:nrow(DT)]
使用
numberAsPOSIXct()
oce
包和Jaap的想法中,您可能想要的是:
DT[,lappy(.SD,unlist),by=1:nrow(DT)][,c:=numberAsPOSIXct(c)][]
为什么这样而不有趣=函数(x)do.call('c',x')?我同意我可以节省2行。。。但是它快得多吗?@jazzurro仅仅使用
asPOSIXct
也能工作。我需要将其封装在一个函数中,以处理多个POSIXct列,我相当确信,对于许多其他类型(例如data.table::ITime)来说,情况也是如此@statquant以列表列中没有真正的类为例,必须动态地重新转换,这不仅仅是执行DT[,c:=as.whater(c)]。因此,我向你提问,但我不认为问题的答案是1。我们没有得到所需的输出(即使这只是一个is.na距离)2。没有基准3。此解决方案放宽了列的类型(或不为多个列提供解决方案)
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