比较一行中的值

时间:2012-06-16 13:18:55

标签: r dataframe

我正在尝试比较数据帧行的值,并删除所有匹配的值,使用此

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

2 个答案:

答案 0 :(得分: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=FALSE传递给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" ...

然后你的代码有效(除了我怀疑你错过了一个逗号):

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

答案 1 :(得分: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), ]

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