連續

2012-06-16 56 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.csvread.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), ] 

創建數據框後,代碼將刪除匹配的行,產生您想要的結果。