2013-02-19 20 views
30

Ho due file csv, e ciascuno dei quali è costituito da una colonna di datigenerando un vettore di differenza tra due vettori

Ad esempio, vecA.csv è come

id 
1 
2 

vecB.csv è come

id 
3 
2 

ho letto i set di dati come segue:

vectorA<-read.table("vecA.csv",sep=",",header=T) 
vectorB<-read.table("vecB.csv",sep=",",header=T) 

Voglio generare un vettore costituito da elementi appartenenti solo a B.

risposta

61

Stai cercando la funzione setdiff

setdiff(vectorB$id, vectorA$id) 

Se non si desidera che questo ridotto a valori unici, è possibile creare una funzione not in

(complimenti a @joran qui Match with negation)

'%nin%' <- Negate('%in%') 

vectorB$id[vectorB$id %nin% vectorA$id] 
+4

+1 per l'aggiunta 'Negate'. Io uso '! (X% in% y)' molto. –

+2

+11 per il comando 'Negate ('% in% ')' !!! –

+0

a @Joran ovviamente;) Ma a mnel anche per il riferimento –

9

Se i file vettoriali sono invece data.table s, allora tutto ciò che serve sono cinque caratteri:

B[!A] 

library(data.table) 

# read in your data, wrap in data.table(..., key="id") 
A <- data.table(read.table("vecA.csv",sep=",",header=T), key="id") 
B <- data.table(read.table("vecB.csv",sep=",",header=T), key="id") 

# Then this is all you need 
B[!A] 

[Matteo] E in v1.8.7 è più semplice e più veloce per leggere il file così:

A <- setkey(fread("vecA.csv"), id) 
B <- setkey(fread("vecB.csv"), id) 
B[!A] 
+4

Molto lucido. rocce data.table! Ed è velocissimo. – N8TRO

Problemi correlati