如何在data.table中按列键入列表?

5

参考这篇帖子,我有另一个关于data.table中列表列的问题。

DT = data.table(x=list(c(1,2),c(1,2),c(3,4,5)))

看起来您无法按列表列进行键控。

DT[,y:=.I,by=x]
Erreur dans `[.data.table`(DT, , `:=`(y, .I), by = x) :
  The items in the 'by' or 'keyby' list are length (2,2,3). Each must be same length as rows in x or number of rows returned by i (3).

我以为只要列表长度相同就可以,但实际上:

DT = data.table(x=list(c(1,2),c(1,2),c(3,5)))
DT[,y:=.I,by=x]
Erreur dans `[.data.table`(DT, , `:=`(y, .I), by = x) :
  The items in the 'by' or 'keyby' list are length (2,2,2). Each must be same length as rows in x or number of rows returned by i (3).

有没有解决方法?如果没有,那提出一个功能请求呢?


是的,目前不允许使用 list 作为关键列。当您执行 setkey(DT, "x") 时会收到此消息。 - Arun
1个回答

3
我会像这样进行一些解决方法:

我会像这样进行一个解决方法:

DT[, y := which(DT$x %in% x), by = 1:nrow(DT)]

这总是返回第一个匹配的索引,它将作为组ID。

您应该像这样做:

DT[, psnInGrp := seq_along(x), by=y]

#        x y psnInGrp
# 1:   1,2 1        1
# 2:   1,2 1        2
# 3: 3,4,5 3        1

不确定 by=1:nrow(DT) 的一般情况。在 j 中使用 lapply 和相关函数可能更快。 - Matt Dowle
@MatthewDowle,是否有可能在不使用“1:nrow(DT)”的情况下逐行选择? - Arun
不确定您的意思,但是是的。lapply可以在列上以及在.SD上使用j - Matt Dowle
我的意思是,如果你想逐个取出x的每个元素,即(1,2),然后是下一个1,2,然后是3,4,5,并执行一个操作(而且没有键集),比如在这里使用which(..),那么如果不使用by中的1:nrow(dt),你该怎么做呢? - Arun
可能是这样的吧?DT[, grp:=lapply(x, function(u) which(DT$x %in% list(u))[1])] - Arun
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接