计算 data.table 中多个列表的长度

Calculate length of multiple lists within a data.table

我想计算 data.table 中列表的每个元素的长度。这是一个小例子。

test<-data.table(
  x = list(c(1,2,3),c(1)),
  y = list(c(2,3),c(1,2,3))
)

#This works:
test[,length_x:=sapply(x,length)]
test[,length_y:=sapply(y,length)]

#But this does not, can somebody explain why and how to correct it:
test[,c("length_x","length_y"):=sapply(.SD,length)]

有人可以解释为什么代码的第二部分不起作用以及如何更正它。

这里的问题是您实际上需要两级迭代

  • 使用 lapply(.SD, ...)
  • 对列进行迭代
  • 迭代列元素以评估“单元格”长度
test[, c("length_x", "length_y") := lapply(.SD, function(column) {
  sapply(column, length)
})]

这可以使用 lapply 中的省略号 (...) 进一步简化。

test[, c("length_x", "length_y") := lapply(.SD, sapply, length)]

像下面这样在 data.table 内尝试 lengths

> test[, paste0("length_", names(test)) := Map(lengths, .SD)][]
       x     y length_x length_y
1: 1,2,3   2,3        3        2
2:     1 1,2,3        1        3