webentwicklung-frage-antwort-db.com.de

Wie lösche ich mehrere Werte aus einem Vektor?

Ich habe einen Vektor wie: a = c(1:10) und ich muss mehrere Werte entfernen, wie: 2, 3, 5

Wie lösche ich diese Zahlen (sie sindNICHTdie Positionen im Vektor) im Vektor?

im Moment schleife ich den Vektor und mache etwas wie: 

a[!a=NUMBER_TO_REMOVE]

Aber ich denke, es gibt eine Funktion, die dies automatisch erledigt.

99
Dail

Der %in%-Operator sagt Ihnen, welche Elemente unter den zu entfernenden Nummern sind:

> 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

Beachten Sie, dass dadurch unvergleichbare Dateien (z. B. NA oder Inf)) unbemerkt entfernt werden (während doppelte Werte in a bleiben, solange sie nicht in remove aufgeführt sind). 

  • Wenn a unvergleichbare Dateien enthalten kann, remove dies nicht, können wir match verwenden und angeben, dass 0 für Nichtübereinstimmungen und unvergleichbare Dateien zurückgegeben werden soll (%in% ist eine herkömmliche Verknüpfung für 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
    

    incomparables = 0 ist nicht benötigt da unvergleichbare Dateien sowieso nicht passen, aber ich würde es aus Gründen der Lesbarkeit einschließen.
    Dies ist übrigens das, was setdiff intern tut (aber ohne die unique, um Duplikate in a wegzuwerfen, die nicht in remove sind).

  • Wenn remove unvergleichbare Dateien enthält, müssen Sie sie einzeln prüfen, z.

    if (any (is.na (remove))) 
      a <- a [! is.na (a)]
    

    (Dies unterscheidet nicht NA von NaN, aber das R-Handbuch warnt trotzdem, dass man sich nicht darauf verlassen sollte, einen Unterschied zwischen ihnen zu haben.)

    Für Inf/-Inf müssen Sie sowohl sign als auch is.finite überprüfen. 

168
cbeleites

Sie können setdiff verwenden.

Gegeben

a <- sample(1:10)
remove <- c(2, 3, 5)

Dann

> a
 [1] 10  8  9  1  3  4  6  7  2  5
> setdiff(a, remove)
[1] 10  8  9  1  4  6  7
81
Brian Diggs
x <- list("a", "b", "c", "d", "e"); # example list

x[-2];       # without 2nd element

x[-c(2, 3, 5)]; # without 2nd,3rd,5th element
13
Vikram

Sie können es wie folgt tun:

> 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

Kurz

> x = x[ - which(x %in% y)]
6
ykpemre

anstatt 

x <- x[! x %in% c(2,3,5)]

mit den Paketen purrr und margrittr können Sie Folgendes tun:

your_vector %<>% discard(~ .x %in% c(2,3,5))

dies ermöglicht das einmalige Subsetting mit dem Vektornamen. Und du kannst es in Rohren verwenden :)

3
krishan404

Zuerst können wir einen neuen Operator definieren,

"%ni%" = Negate( "%in%" )

Dann ist es wie x nicht in entfernen 

x <- 1:10
remove <- c(2,3,5)
x <- x[ x %ni% remove ]

oder warum zu entfernen, gehen Sie direkt 

x <- x[ x %ni% c(2,3,5)]
2
TheMI
q <- c(1,1,2,2,3,3,3,4,4,5,5,7,7)
rm <- q[11]
remove(rm)
q
q[13] = NaN
q
q %in% 7

Dadurch wird die 13 in einem Vektor auf keine Zahl (NAN) gesetzt, sondern es wird falsch Remove (q [c (11,12,13)]) arbeiten Sie an der Vektornummer ... Sie entfernen den gesamten Vektor, aber möglicherweise kein einzelnes Element.

1
Mahendra

UPDATE:

Alle obigen Antworten funktionieren nicht für die wiederholten Werte. Die Antwort von @ BenBolker mit dem Prädikat duplicated() löst dieses Problem:

full_vector[!full_vector %in% searched_vector | duplicated(full_vector)]

Ursprüngliche Antwort: hier schreibe ich dazu eine kleine Funktion:

exclude_val<-function(full_vector,searched_vector){

      found=c()

      for(i in full_vector){  

        if(any(is.element(searched_vector,i))){
          searched_vector[(which(searched_vector==i))[1]]=NA
        }
        else{
          found=c(found,i)
        }
    }

    return(found)
}

sagen wir also full_vector=c(1,2,3,4,1) und searched_vector=c(1,2,3)

exclude_val(full_vector,searched_vector) wird zurückgegeben (4,1), obige Antworten geben jedoch nur (4) zurück.

1
Özgür

Es gibt auch subset, was manchmal nützlich sein kann:

a <- sample(1:10)
bad <- c(2, 3, 5)

> subset(a, !(a %in% bad))
[1]  9  7 10  6  8  1  4