2012-06-16 8 views
6

Próbuję porównać wartości w wierszach ramka danych i usuwając wszystkie te, które pasują do siebie, z tegoporównywania wartości w wierszu

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

gdzie

> dat 

powraca

n1 n2 
n1 n4 
n4 n5 
n1 n3 
n4 n4 

Dlatego chcę, aby porównać wartości i usunąć ostatni wiersz, ponieważ obie kolumny mają te same dane. Ale gdy używam powyższy kod, to mówi mi

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

str(dat) czyta

'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

Proszę wpisać wartość 'str (dat)' w swoim pytaniu. Podejrzewam, że 'dat' to data.frame i niejawnie przekonwertowałeś swoje kolumny na czynniki, a nie na wektory znakowe. – Andrie

Odpowiedz

14

Podejrzewam, że podczas tworzenia danych nieumyślnie i niejawnie przekonwertowano kolumny na czynniki. Stało się tak prawdopodobnie podczas odczytu danych ze źródła, np. podczas korzystania z read.csv lub read.table. Ten przykład ilustruje go:

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 

Lekarstwem jest przekazanie argumentu stringsAsFactors=FALSE do 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" ... 

Wtedy twój kod działa (oprócz tego, że podejrzewam tęskniłeś przecinek):

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

Jednym rozwiązaniem byłoby polecić ramka danych nie konwertować wektorów znaków na czynniki (z wykorzystaniem 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), ] 

Po utworzeniu ramki danych kod usuwa pasujące wiersze, tworząc pożądany wynik.

Powiązane problemy