连续

2012-06-16 30 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), ] 

创建数据框后,代码将删除匹配的行,产生您想要的结果。