使用索引向量从列表中选择/删除值

时间:2017-09-27 13:37:24

标签: r list

在看到SO QUESTION

时,我脑海中浮现出一个问题
onSetsChange(sets, index){
    var setsFormArray = <FormArray>this.myForm.controls.sets;
    (setsFormArray.at(index)).patchValue(sets);
    console.log(index);
    console.log(setsFormArray);
}

INPUT

x <- list(c(1:6,32,24), c(1:4,8,10,12,13,17,24), c(1:5,9:15,17,18,19,20,32))

IND <- !duplicated(unlist(x))
> x
[[1]]
[1]  1  2  3  4  5  6 32 24

[[2]]
 [1]  1  2  3  4  8 10 12 13 17 24

[[3]]
 [1]  1  2  3  4  5  9 10 11 12 13 14 15 17 18 19 20 32

是否可以使用IND访问列表元素,所以我得到:

期望的输出

> IND
 [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE
[23] FALSE  TRUE FALSE  TRUE FALSE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE

通常我会访问[[1]] [1] 1 2 3 4 5 6 32 24 [[2]] [1] 8 10 12 13 17 [[3]] [1] 9 11 14 15 18 19 20 等元素......

1 个答案:

答案 0 :(得分:2)

您可以尝试:

IND2 <-split(IND, rep(1:3, sapply(x, length)))
Map(function(x, y) x[y], x, IND2)
[[1]]
[1]  1  2  3  4  5  6 32 24

[[2]]
[1]  8 10 12 13 17

[[3]]
[1]  9 11 14 15 18 19 20

我们的想法是使用相应的长度将IND向量转换回列表。然后使用Map循环遍历每个列表元素以进行子集化。

或试试reshape2&amp;整合解决方案:

library(tidyverse)
library(reshape2)
melt(x) %>% 
  filter(!duplicated(value)) %>% 
  with(., split(value, L1))