18

Tôi có hai khung dữ liệu sau đây (ví dụ):Xóa các hàng tồn tại trong một khung dữ liệu khác?

df1:

name profile type strand 
A  4.5  1  + 
B  3.2  1  + 
C  5.5  1  + 
D  14.0  1  - 
E  45.1  1  - 
F  32.8  1  - 
G  19.9  1  + 

df2:

name 
A 
B 
C 
G 

Tôi muốn xóa các hàng trong df1df1$name = df2$name để có được như sau:

Đầu ra:

name profile type strand 
D  14.0  1  - 
E  45.1  1  - 
F  32.8  1  - 

Nếu bất cứ ai có thể cho tôi biết đoạn mã nào sử dụng nó sẽ có nhiều trợ giúp, có vẻ đơn giản lúc đầu nhưng tôi đã làm rối tung nó kể từ hôm qua.

+1

Đề nghị đọc một số hướng dẫn sử dụng trên R, điểm khởi đầu tốt http://stackoverflow.com/tags/r/info – zx8754

+0

Cảm ơn bạn đã liên kết hữu ích! – biohazard

Trả lời

24

Bạn cần toán tử %in%. Vì vậy,

df1[!(df1$name %in% df2$name),] 

sẽ cung cấp cho bạn những gì bạn muốn.

  • df1$name %in% df2$name kiểm tra liệu các giá trị trong df1$name là trong df2$name
  • Nhà điều hành ! đảo ngược kết quả.
+0

Cảm ơn bạn rất nhiều! Bạn có bất kỳ ý tưởng những gì tôi nên làm gì để làm cho nó đối xứng? Tôi nhận thấy rằng 'df1 [! (Df1 $ name% trong% df2 $ name),]' và 'df2 [! (Df2 $ name% in% df1 $ name),]' cho tôi kết quả khác ... – biohazard

+0

nếu tên cột không phải là duy nhất? – Cina

+1

Trong một khung dữ liệu, các cột phải là duy nhất. – csgillespie

0

df1 [! (As.character (df1 $ jobId)% trong% as.character (df2 $ jobId)),]

tôi đã có thêm as.charaacter để thực hiện của tôi vì JobID không phải là một nhân vật và một yếu tố thay vào đó, không phải là% trong% phải chuyển đổi này trực tiếp

12

này đôi khi được gọi là một chống tham gia:

library(dplyr) 
anti_join(df1, df2, by = "name")