2014-10-03 1 views
2

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

> 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, и иногда мне трудно найти примеры, если сразу несколько вещей вложены.

ответ

5

Фактически только что разобрался с этим самостоятельно. Ответ:

data.frame(unlist(lapply(matches, function(x) sum(x)))) 

первая часть yiels список списков с одним элементом каждого, суммирования элементов каждого списка

> 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 

Наконец он превращается в dataframe с помощью функции data.frame().

+2

Упрощение: 'sapply (matches, sum)' – josliber

+1

Поскольку у вас есть только аргумент 'x', вы можете просто сделать:' data.frame (sapply (matches, sum)) ' –

+1

@josilber jinx. –