2013-05-16 1 views
2

Пусть говорят, у вас есть список вектора:Sum вектор с соответствующим именем

L = list() 
L[[1]]= c(2,34,6,7,3) 
L[[2]]= c(3,4,6,8,1) 
names(L[[1]])=c("A","B","C","D","E") 
names(L[[2]])=c("A","R","C","D","F") 
L 

## [[1]] 
## A B C D E 
## 2 34 6 7 3 
## 
## [[2]] 
## A R C D F 
## 3 4 6 8 1 

И я хочу суммировать 2 вектора по имени каждого элемента ... Результаты:

A B C D E F R 
5 34 12 15 3 1 4 

Спасибо

ответ

4

Другое решение с использованием tapply

> tapply(unlist(L), names(unlist(L)), sum) 
A B C D E F R 
5 34 12 15 3 1 4 

EDIT

Это будет работать, даже если ваши векторы имеют различные длины, смотри пример:

> L = list() 
> L[[1]]= 1:10 
> L[[2]]= c(3,4,6,8,1) 
> names(L[[1]])=LETTERS[1:10] 
> names(L[[2]])=c("A","R","C","D","F") 

> tapply(unlist(L), names(unlist(L)), sum) 
A B C D E F G H I J R 
4 2 9 12 5 7 7 8 9 10 4 # IT WORKS!!! 
+1

Мне нравится это лучше, чем у меня. –

+0

Спасибо, что работает на данный момент ... но что, если мои векторы имеют одинаковую длину, это не сработает –

+0

@joellapalme см. Мое редактирование. –

2
x <- aggregate(unlist(L), by=list(names(unlist(L))), FUN=sum) 
result <- x$x 
names(result) <- x$Group.1 
result 
## A B C D E F R 
## 5 34 12 15 3 1 4 
+0

Благодаря это работает сейчас ... но что, если мои векторы не совпадают длина, это не сработает. –

+0

Конечно, он будет работать и в этом случае. –