2012-04-24 19 views
5

Mam dwie duże i małe listy. Chcę wiedzieć, który z elementów na dużej liście nie znajduje się na mniejszej liście. Lista składa się z nieruchomościZnajdź elementy nie na mniejszej liście znaków, ale na dużej liście

([1] "character"   "vector"    "data.frameRowLabels" 
[4] "SuperClassMethod" 

Oto mały przykład i błędów jestem coraz

A <- c("A", "B", "C", "D") 
B <- c("A", "B", "C") 
    new <- A[!B] 
Error in !B : invalid argument type 

Oczekiwany wynik jest nowy < - c ("D")

Odpowiedz

11

Spójrz na help("%in%") - nie przykład na dole tej strony, który rozwiązuje tę sytuację.

A <- c("A", "B", "C", "D") 
B <- c("A", "B", "C") 
(new <- A[which(!A %in% B)]) 

# [1] "D" 

EDIT:

Jak Tyler zwraca uwagę, należy zabrać ze sobą własne porady i czytać dokumenty wsparcia. which() jest niepotrzebny, gdy w tym przykładzie używasz %in%. Tak więc,

+0

, którą jest tu zbędne. –

+0

@Tyler, Masz rację; Powinienem wziąć moją własną radę: od 'help ("% in% ")': "To% w% nigdy nie zwraca NA sprawia, że ​​jest to szczególnie użyteczne w warunkach". Zawarłem "które" z przyzwyczajenia, ponieważ zostałem spalony bez niego. Tutaj jest niepotrzebne. – BenBarnes

4

! działa tylko na wektorach logicznych. B nie jest logiczne, co powoduje błąd. Dekomponowanie kroków, które próbujesz wykonać, pokaże ci to (tj. !B). W tym przypadku chcesz użyć %in% (lub match).

A[!A %in% B] 

celu rozłożenia powyższy kod:

  1. A %in% B tworzy logiczny wektor, który jest TRUE dla wartości A które istnieją w B.
  2. !A %in% B neguje (odwrócenie) logika (1)
  3. A[!A %in% B] zwraca wektor elementów, które są TRUE w (2)
1

Chociaż myślę sets mogą pomóc radzić sobie z różnych list.

W twoim przypadku można po prostu użyć:

A <- c("A", "B", "C", "D") 
B <- c("A", "B", "C") 

# to find difference 
setdiff(A, B) 

# to find intersect 
intersect(A, B) 

# to find union 
union(A, B) 
Powiązane problemy