我有一个清单
$true
[1] 0
$false
[1] 183
$false
[1] 0
$true
[1] 110
我需要删除重复和归零的元素。
理想情况下,我会将所有具有相同名称的元素相加,但考虑到它们是零,我可以将它们排除在外,就像这样:
$false
[1] 183
$true
[1] 110
感谢。
答案 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