Есть ли способ или встроенная функция R, которая может суммировать значения повторяющихся имен в списке? - PullRequest
4 голосов
/ 06 апреля 2020

Допустим, у меня есть этот список:

values <- list(2, 8, 3, 21, 54, 2, 43, 31)
countries <- list('US', 'UK', 'China', 'US', 'Russia', 'UK', 'US', 'China')
names(values) <- countries

Тогда значения выглядят следующим образом: ('US' = 2, 'UK' = 8, 'China' = 3, 'US' = 21, 'Russia' = 54, 'UK' = 2, 'US' = 43, 'China' = 31)

Есть ли встроенная функция в R или какой-то короткий способ добавить значения дубликатов? То есть, чтобы значения стали такими: ('UK' = 10, 'China' = 34, 'Russia' = 54, 'US' = 66) (порядок не имеет значения)

Ответы [ 3 ]

2 голосов
/ 06 апреля 2020

Опция с использованием tidyverse

library(dplyr)
library(tibble)
library(tidyr)
enframe(values) %>%
    unnest(c(value)) %>% 
    group_by(name) %>% 
    summarise(value = sum(value)) %>%
    deframe %>% 
    as.list
#$China
#[1] 34

#$Russia
#[1] 54

#$UK
#[1] 10

#$US
#[1] 66

Или с использованием base R

as.list(tapply(unlist(values), names(values), sum))
#$China
#[1] 34

#$Russia
#[1] 54

#$UK
#[1] 10

#$US
#[1] 66
1 голос
/ 06 апреля 2020
sapply(unique(countries), function(x){sum(unlist(values[names(values)==x]))})

тоже работает. Сначала я не видел, чтобы у вас были списки.

1 голос
/ 06 апреля 2020

Один из вариантов может быть:

as.list(with(aggregate(values ~ ind, sum, data = stack(values)), 
             setNames(values, ind)))

$US
[1] 66

$UK
[1] 10

$China
[1] 34

$Russia
[1] 54
...