计算 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
我想计算 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