В R как объединить список - PullRequest
0 голосов
/ 26 мая 2018

У меня есть список

$true
[1] 0

$false
[1] 183

$false
[1] 0

$true
[1] 110

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

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

$false
[1] 183

$true
[1] 110

Спасибо.

Ответы [ 4 ]

0 голосов
/ 26 мая 2018

Соответственно, удалив 0 и суммируя все в базе R:

l[sapply(l,`!=`,0)] # or more robust: l[!sapply(l,identical,0)]
# $false
# [1] 183
# 
# $true
# [1] 110

setNames(
  lapply(unique(names(l)),
         function(x) sum(unlist(l[names(l)==x]))),
  unique(names(l)))
# $true
# [1] 110
# 
# $false
# [1] 183
0 голосов
/ 26 мая 2018

Мы можем использовать tapply(), если мы unlist список, а затем использовать имена списков в качестве групп.

tapply(unlist(x), names(x), sum, simplify = FALSE)
# $false
# [1] 183
#
# $true
# [1] 110

Если нет необходимости получать результат списка, мы можем отбросить simplify.

tapply(unlist(x), names(x), sum)
# false  true 
#   183   110 

, где x - ваш список.

0 голосов
/ 26 мая 2018

Мы можем удалить элементы, которые равны 0, с помощью

library(purrr)
keep(lst, ~ .x != 0)
#$false
#[1] 183

#$true
#[1] 110

Или с base R

lst[unlist(lst)!=0]

Или с discard

discard(lst, ~ !.x)
0 голосов
/ 26 мая 2018
# your example data
the.list <- list(
  true = 0,
  false = 183,
  false = 0,
  true = 110
)

# convert the list to a simpler named vector
list.collapsed <- unlist(the.list)

# re-split into a list of vectors, one per unique name in the original list
list.split <- split(list.collapsed, names(list.collapsed))

# sum each label's elements
list.condensed <- lapply(list.split, sum)

$false
[1] 183

$true
[1] 110

Как вы говорите, все элементы, которые вы хотите "свернуть", равны 0 и также могут быть отфильтрованы различными способами, но этот метод будет суммировать элементы, как вы изначально хотели.

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