Добавление всех элементов двух списков - PullRequest
8 голосов
/ 26 октября 2011

Предположим, у меня есть два списка, и соответствующие элементы списков имеют одинаковую форму:

 e1=list(1,c(1,2,3),matrix(1:12,3,4))
 e2=list(1,c(1,2,3),matrix(1:12,3,4))

, и я хочу добавить эти два списка поэлементно.Вот мое решение, которое работает для любой длины списков и любой формы элемента, если они совпадают и могут быть добавлены:

> esum
function(e1,e2){
  e = list()
  for(i in 1:length(e1)){
    e[[i]]=e1[[i]]+e2[[i]]
  }
  e
}
> esum(e1,e2)

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

Это первый этап проблемы, который заключается в том, чтобы сложить целый список многих из этих списков, но как только esum определен, его просто уменьшают:

 > ee = list(e1,e2,e1,e1,e2)
 > Reduce(esum,ee)[[3]]  # lets just check [[3]] for now
      [,1] [,2] [,3] [,4]
 [1,]    5   20   35   50
 [2,]   10   25   40   55
 [3,]   15   30   45   60

Итак, любойу них есть однострочник?

Да, я знаю, что однострочник не всегда лучший.

Ответы [ 2 ]

18 голосов
/ 26 октября 2011

Что-то вроде

   mapply("+",e1,e2)

работает для первой части ...

Reduce( function(x,y) mapply("+",x,y),ee)[[3]]

Может быть что-то еще более забавное.Reduce не принимает аргумент ..., поэтому мы не можем сойти с Reduce(mapply,ee,FUN="+")[[3]]

0 голосов
/ 26 октября 2011

Как насчет: esum <- unlist (e1) + unlist (e2) </p>

Вам придется «перестраивать» свою структуру списка, что легко, если у вас всегда одна и та же структура, и она займет всегонемного работы, если вы имеете дело с произвольными структурами.

Ааа, забудь об этом.Решение mapply('+',...) приятнее и превзошло меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...