Вычислите длину нескольких списков в таблице данных

#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