Reputation: 11366
I have the two big and small list. I want to know which of the elements in big list are not in smaller list. The list consists of property
([1] "character" "vector" "data.frameRowLabels"
[4] "SuperClassMethod"
Here is small example and error I am getting
A <- c("A", "B", "C", "D")
B <- c("A", "B", "C")
new <- A[!B]
Error in !B : invalid argument type
The expected output is new <- c("D")
Upvotes: 12
Views: 24031
Reputation: 1468
While I think sets
may help you to deal with different lists.
In your case, you can just use:
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)
Upvotes: 4
Reputation: 19454
Look at help("%in%")
- there's an example all the way at the bottom of that page that addresses this situation.
A <- c("A", "B", "C", "D")
B <- c("A", "B", "C")
(new <- A[which(!A %in% B)])
# [1] "D"
EDIT:
As Tyler points out, I should take my own advice and read the support documents. which()
is unnecessary when using %in%
for this example. So,
(new <- A[!A %in% B])
# [1] "D"
Upvotes: 18
Reputation: 176668
!
only works on logical vectors. B
is not logical, which is what causes the error. Decomposing the steps you're trying to make will show you this (i.e. !B
). In this case, you want to use %in%
(or match
).
A[!A %in% B]
To decompose the above code:
A %in% B
creates a logical vector that is TRUE
for values of A
that exist in B
.!A %in% B
negates (reverses) the logic in (1)A[!A %in% B]
returns the vector of elements that are TRUE
in (2)Upvotes: 6