我有一个像这样的矢量:a = c(1:10)我需要删除多个值,例如:2, 3, 5
如何在向量中删除这些数字(它们不是向量中的位置)?
此刻我循环向量并执行以下操作:
a[!a=NUMBER_TO_REMOVE]
Run Code Online (Sandbox Code Playgroud)
但我认为有一个功能可以自动完成.
cbe*_*ica 178
该%in%运营商告诉您哪些元素是numers删除其中:
> a <- sample (1 : 10)
> remove <- c (2, 3, 5)
> a
[1] 10 5 2 7 1 6 3 4 8 9
> a %in% remove
[1] FALSE TRUE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
> a [! a %in% remove]
[1] 10 7 1 6 4 8 9
Run Code Online (Sandbox Code Playgroud)
请注意,这将默默地删除不兼容的东西(类似NA或类似的东西Inf)(虽然它将保留重复值,a只要它们没有列出remove).
如果a可以包含不兼容,但remove不会,我们可以使用match,告诉它返回0非匹配和不兼容(%in%是一个简便的快捷方式match):
> a <- c (a, NA, Inf)
> a
[1] 10 5 2 7 1 6 3 4 8 9 NA Inf
> match (a, remove, nomatch = 0L, incomparables = 0L)
[1] 0 3 1 0 0 0 2 0 0 0 0 0
> a [match (a, remove, nomatch = 0L, incomparables = 0L) == 0L]
[1] 10 7 1 6 4 8 9 NA Inf
Run Code Online (Sandbox Code Playgroud)
incomparables = 0是不是需要为incomparables将反正不匹配,但我包括它可读性的原因.
这,顺便说一句,什么setdiff内部做(但没有unique扔掉重复在a其不在remove).
如果remove包含不兼容的内容,则必须单独检查它们,例如
if (any (is.na (remove)))
a <- a [! is.na (a)]
Run Code Online (Sandbox Code Playgroud)
(这没有区别NA,NaN但R手册反正警告说不应该依赖它们之间的区别)
为Inf/ -Inf你必须检查两个sign和is.finite
Bri*_*ggs 92
你可以用setdiff.
特定
a <- sample(1:10)
remove <- c(2, 3, 5)
Run Code Online (Sandbox Code Playgroud)
然后
> a
[1] 10 8 9 1 3 4 6 7 2 5
> setdiff(a, remove)
[1] 10 8 9 1 4 6 7
Run Code Online (Sandbox Code Playgroud)
你可以这样做:
> x<-c(2, 4, 6, 9, 10) # the list
> y<-c(4, 9, 10) # values to be removed
> idx = which(x %in% y ) # Positions of the values of y in x
> idx
[1] 2 4 5
> x = x[-idx] # Remove those values using their position and "-" operator
> x
[1] 2 6
Run Code Online (Sandbox Code Playgroud)
不久
> x = x[ - which(x %in% y)]
Run Code Online (Sandbox Code Playgroud)
小智 7
代替
x <- x[! x %in% c(2,3,5)]
Run Code Online (Sandbox Code Playgroud)
使用包purrrand magrittr,您可以执行以下操作:
your_vector %<>% discard(~ .x %in% c(2,3,5))
Run Code Online (Sandbox Code Playgroud)
这允许subset仅使用向量名称一次。你可以在管道中使用它:)