R 基于另一个向量删除向量项
我有两个向量R 基于另一个向量删除向量项,r,R,我有两个向量 a <- c(1:20) b <- c(2,11,14) a您可以简单地索引到a并删除b中索引处的元素,如下所示: a <- c(1:20) b <- c(2,11,14) a[-b] [1] 1 3 4 5 6 7 8 9 10 12 13 15 16 17 18 19 20 @Gopala的方法在大多数情况下都有效,除非“b”向量为空。为了使它更一般化,我们可以使用seq\u以及(a)和%in% a[!seq_along(a) %i
a <- c(1:20)
b <- c(2,11,14)
a您可以简单地索引到a
并删除b
中索引处的元素,如下所示:
a <- c(1:20)
b <- c(2,11,14)
a[-b]
[1] 1 3 4 5 6 7 8 9 10 12 13 15 16 17 18 19 20
@Gopala的方法在大多数情况下都有效,除非“b”向量为空。为了使它更一般化,我们可以使用seq\u以及(a)
和%in%
a[!seq_along(a) %in% b]
#[1] 1 3 4 5 6 7 8 9 10 12 13 15 16 17 18 19 20
现在,如果我们把“b”改为
b <- vector('integer')
a[-b]
#integer(0)
a[!seq_along(a) %in% b]
#[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
@thelatemail发布的使第一种方法通用的方法
system.time(a[if(length(b)==0) TRUE else -b])
# user system elapsed
# 0.05 0.00 0.05
注:来自@Gopala帖子的基准数据。关于a[-b]
的情况如何?这就是你想要的吗?我对R比较陌生,所以我还不太清楚其中的细微差别。此外,该解决方案将应用于长度为310万的向量,因为我正在处理一个原始文本文件。您可以尝试一下……除了我上面提供的方法之外,不知道还有什么更好的方法可以做到这一点。谢谢@Gopala,做到了。我想得太多了。如果你发布一个解决方案,我会投票表决。或者只检查它是否为空a[If(length(b)==0)TRUE-else-b]
a[!seq_along(a) %in% b]
#[1] 1 3 4 5 6 7 8 9 10 12 13 15 16 17 18 19 20
b <- vector('integer')
a[-b]
#integer(0)
a[!seq_along(a) %in% b]
#[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
system.time(a[-b])
# user system elapsed
# 0.07 0.00 0.08
system.time(a[!seq_along(a) %in% b])
# user system elapsed
# 0.17 0.01 0.18
system.time(a[if(length(b)==0) TRUE else -b])
# user system elapsed
# 0.05 0.00 0.05