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
4

2 に答える 2

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
于 2012-06-16T13:37:07.097 に答える
2

1 つの解決策は、データ フレームに文字ベクトルを係数に変換しないように指示することです ( を使用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), ]

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

于 2012-06-16T13:30:57.450 に答える