R: суммируйте элементы каждого списка в списке и возвращайте результат во фрейме данных


У меня есть список списков в R; каждый список содержит результаты команды Grep, указывающей позицию, в которой была найдена строка поиска. Команда

> matches<-lapply(ListOfFiles, function(x)
+ grep("SearchString",readLines(x),ignore.case = T))

Производит

//I copy the results that the function actually yields for the sake of the example

> matches<-list(c(11L, 13L), c(9L, 12L, 14L, 15L, 16L, 19L, 20L, 22L, 25L
+ ), c(5L, 8L, 11L), c(10L, 11L, 13L, 14L, 16L), c(5L, 7L, 9L), 
+ integer(0))

> matches
[[1]]
[1] 11 13

[[2]]
[1]  9 12 14 15 16 19 20 22 25

[[3]]
[1]  5  8 11

[[4]]
[1] 10 11 13 14 16

[[5]]
[1] 5 7 9

[[6]]
integer(0)
Мне нужно преобразовать это в простой фрейм данных из 6 строк и 1 столбца, причем каждая "ячейка" имеет сумму каждого из 6 списков matches.

Если это вообще возможно, пожалуйста, попытайтесь объяснить синтаксис, который я должен использовать; я новичок в R, и иногда мне трудно следовать примерам, если несколько вещей вложены сразу.

1 2

1 ответ:

На самом деле я только что понял это сам. Ответ таков:

data.frame(unlist(lapply(matches, function(x) sum(x))))
Первая часть представляет собой список списков с одним элементом в каждом, суммирование элементов каждого списка
> lapply(matches, function(x) sum(x))
[[1]]
[1] 24

[[2]]
[1] 152

[[3]]
[1] 24

[[4]]
[1] 64

[[5]]
[1] 21

[[6]]
[1] 0

Вторая часть генерирует вектор из этого. Очевидно, это рекурсивная функция:

> unlist(lapply(matches, function(x) sum(x)))
[1]  24 152  24  64  21   0
Наконец, он преобразуется в фрейм данных с помощью функции data.frame().