2012-06-16 3 views
6

Я пытаюсь сравнить значения на кадр данных строк, и удаление всех тех, которые соответствуют, с этимсравнивающие значения в строке

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

где

> dat 

возвращает

n1 n2 
n1 n4 
n4 n5 
n1 n3 
n4 n4 

Так что я хочу, чтобы он сравнивал значения и удалял последнюю строку, поскольку оба столбца имеют одинаковые данные. Но когда я использую приведенный выше код, он говорит мне

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

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 
+0

Просьба указать значение 'str (dat)' в вашем вопросе. Я подозреваю, что 'dat' является data.frame, и вы неявно преобразовали ваши столбцы в факторы, а не в векторы символов. – Andrie

ответ

14

Я подозреваю, что при создании ваших данных вы непреднамеренно и неявно преобразовали свои столбцы в факторы. Это возможно, когда вы читаете данные из источника, например. при использовании read.csv или read.table. Этот пример иллюстрирует это:

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 

Лекарство передать аргумент stringsAsFactors=FALSE в 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" ... 

Тогда ваш код работает (кроме того, что я подозреваю, что вы пропустили запятую):

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

Одно решение было бы поручить кадр данных не превращали векторов символов на множители (с использованием 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), ] 

После создания кадра данных код удаляет соответствующие строки, создавая желаемый результат.