#r #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)]
Может кто-нибудь объяснить, почему вторая часть кода не работает и как ее исправить.
Ответ №1:
Проблема здесь в том, что на самом деле вам нужно два уровня итерации
- Повторение по столбцам с
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)]
Комментарии:
1. Хороший ответ, в голосовании!. Я думаю , вы можете попробовать
lengths
, что может сократить ваш код.
Ответ №2:
Попробуйте lengths
в рамках data.table
, как показано ниже
> 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