在R中如何合并列表

时间:2018-05-25 22:16:37

标签: r

我有一个清单

$true
[1] 0

$false
[1] 183

$false
[1] 0

$true
[1] 110

我需要删除重复和归零的元素。

理想情况下,我会将所有具有相同名称的元素相加,但考虑到它们是零,我可以将它们排除在外,就像这样:

$false
[1] 183

$true
[1] 110

感谢。

4 个答案:

答案 0 :(得分:2)

如果我们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是您的列表。

答案 1 :(得分:1)

# 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,也可以通过各种方式过滤掉,但这种方法会根据你的需要对元素进行求和。

答案 2 :(得分:0)

我们可以用

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

#$true
#[1] 110

base R

lst[unlist(lst)!=0]

discard

discard(lst, ~ !.x)

答案 3 :(得分:0)

分别通过删除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