从R中的向量列表中删除特定元素

时间:2019-04-07 22:27:11

标签: r list

假设我有一个索引和值列表。

indx_list <- list(1,2,c(3,4),5,c(6,7,8))
val_list <- list(0.1,0.6,c(0.8,0.9),0.3,c(0.4,0.8,0.5))

然后,我想通过删除索引c(4,7)和相应的值c(0.9,0.5)来更新两个列表。使用lapplysetdiff可以很容易地做到这一点。例如:

indx_list_new <- lapply(indx_list,function(x) setdiff(x,c(4,7)))
val_list_new <- lapply(val_list,function(x) setdiff(x,c(0.9,0.5)))

但是,我事先不知道要删除哪些索引和相应的值。

set.seed(1234)
indx_flag <- sample(seq(8),2)

您还可以看到某些值是重复的(即0.8),因此使用setdiff可能实际上会删除错误位置的值。

问题

1)我仍然可以使用lapplysetdiff来更新indx_list,但是如何更新val_list中的值?

2)lapply是这里最有效的解决方案吗?我将拥有包含数千个元素的列表,每个元素可以是数百个索引/值的向量。

编辑

列表中的每个元素(最高级别)实际上都有特殊的含义,因此我想保留列表结构。

2 个答案:

答案 0 :(得分:2)

相反,将数据整理为“整洁”的表示形式

df = data.frame(
    indx = unlist(indx_list),
    val = unlist(val_list),
    grp = factor(rep(seq_along(indx_list), lengths(indx_list)))
)

操作或多或少是透明的

base::subset(df, !indx %in% c(4, 7))
  indx val grp
1    1 0.1   1
2    2 0.6   2
3    3 0.8   3
5    5 0.3   4
6    6 0.4   5
8    8 0.5   5

使用subset()df[!df$indx %in% c(4, 7), , drop = FALSE]类似。 (我使用factor()允许空组,即没有相应值的级别。)

答案 1 :(得分:1)

这里尝试使用minrelist删除相同的点:

Map