2012-06-16 8 views
6

Estoy tratando de comparar los valores de las filas de tramas de datos, y la eliminación de todos los que coinciden, con esteque comparan valores de una fila

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

donde

> dat 

vuelve

n1 n2 
n1 n4 
n4 n5 
n1 n3 
n4 n4 

Por lo tanto, quiero que compare los valores y elimine la última fila, ya que ambas columnas tienen los mismos datos. Pero cuando se utiliza el código anterior, me dice

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

la str(dat) lee

'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

Por favor, publique el valor de 'str (dat)' en su pregunta. Sospecho que 'dat' es un data.frame y usted ha convertido implícitamente sus columnas a factores, en lugar de vectores de caracteres. – Andrie

Respuesta

14

Sospecho que en la creación de sus datos, involuntariamente e implícitamente convirtió sus columnas a factores. Esto posiblemente sucedió cuando leíste los datos de la fuente, p. cuando se usa read.csv o read.table. Este ejemplo ilustra que:

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 

El remedio consiste en pasar el argumento 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" ... 

Entonces funciona el código (excepto que sospecho que has perdido una coma):

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

Una solución sería la de instruir a la trama de datos no convierte vectores de caracteres en factores (utilizando 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), ] 

Después de crear el marco de datos, el código elimina las filas correspondientes, produciendo el resultado que deseaba.

Cuestiones relacionadas