2012-06-16 6 views
6

行の値を比較し、このIはデータフレームの行の値を比較しようとしてい

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=FALSEread.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), ] 

データフレームを作成した後、コードは一致する行を削除し、必要な結果を生成します。

関連する問題