2012-06-16 13 views
6

sto cercando di confrontare valori su righe struttura dati, e rimuovendo tutti quelli che hanno, con questaconfrontando valori di una riga

dat[!dat[1]==dat[2]] 

dove

> dat 

rendimenti

n1 n2 
n1 n4 
n4 n5 
n1 n3 
n4 n4 

Quindi voglio confrontare i valori ed eliminare l'ultima riga, poiché entrambe le colonne hanno gli stessi dati. Ma quando io uso il codice di cui sopra, mi dice

Error in Ops.factor(left, right) : level sets of factors are different 

il str(dat) legge

'data.frame': 5 obs. of 2 variables: 
$ V1: Factor w/ 2 levels "n1","n4": 1 1 2 1 2 
$ V2: Factor w/ 4 levels "n2","n3","n4",..: 1 3 4 2 3 
+0

Inserisci il valore di 'str (dat)' nella tua domanda. Sospetto che 'dat' sia un data.frame e hai implicitamente convertito le tue colonne in fattori, piuttosto che in vettori di caratteri. – Andrie

risposta

14

Sospetto che nella creazione dei dati, sia stato inavvertitamente e implicitamente convertito le colonne in fattori. Questo potrebbe accadere quando leggi i dati dalla fonte, ad es. quando si utilizza read.csv o read.table. Questo esempio illustra che:

dat <- read.table(text=" 
n1 n2 
n1 n4 
n4 n5 
n1 n3 
n4 n4") 

str(dat) 
'data.frame': 5 obs. of 2 variables: 
$ V1: Factor w/ 2 levels "n1","n4": 1 1 2 1 2 
$ V2: Factor w/ 4 levels "n2","n3","n4",..: 1 3 4 2 3 

Il rimedio è quello di passare l'argomento stringsAsFactors=FALSE a read.table():

dat <- read.table(text=" 
n1 n2 
n1 n4 
n4 n5 
n1 n3 
n4 n4", stringsAsFactors=FALSE) 

str(dat) 
'data.frame': 5 obs. of 2 variables: 
$ V1: chr "n1" "n1" "n4" "n1" ... 
$ V2: chr "n2" "n4" "n5" "n3" ... 

Allora il tuo codice funziona (se non che ho il sospetto che ti sei perso una virgola):

dat[!dat[1]==dat[2], ] 
    V1 V2 
1 n1 n2 
2 n1 n4 
3 n4 n5 
4 n1 n3 
2

Una soluzione potrebbe essere quella di incaricare il frame di dati non convertire vettori di caratteri in fattori (utilizzando stringAsFactors=F):

x <- c('n1', 'n1', 'n4', 'n1', 'n4') 
y <- c('n2', 'n4', 'n5', 'n3', 'n4') 
df <- data.frame(x, y, stringsAsFactors=F) 
df <- df[-which(df$x == df$y), ] 

Dopo aver creato il frame di dati, il codice rimuove le righe corrispondenti, producendo il risultato desiderato.