r数据帧中行的标识

时间:2013-06-13 09:43:25

标签: r

我想比较数据帧的两行以确定身份。我认为same()函数适用于此任务,但它不能按预期工作。这是一个最小的例子:

x=factor(c("x","x"),levels=c("x","y"))
y=factor(c("y","y"),levels=c("x","y"))
df=data.frame(x,y)
df
  x y
1 x y
2 x y

identical(df[1,],df[2,])
[1] FALSE
> df[1,]==df[2,]
     x    y

1 TRUE TRUE

有人可以解释为什么same()返回FALSE吗?

谢谢, 托马斯

2 个答案:

答案 0 :(得分:5)

identical(df[1,],df[2,])
#[1] FALSE
all.equal(df[1,],df[2,])
#[1] "Attributes: < Component 2: Mean relative difference: 1 >"

all.equal(df[1,],df[2,],check.attributes = FALSE)
#[1] TRUE

anyDuplicated(df[1:2,])>0
#[1] TRUE

答案 1 :(得分:2)

尝试此功能

all.equal(df[1,],df[2,])
[1] "Attributes: < Component 2: Mean relative difference: 1 >"

(通常比较因素可能会产生“意外”结果......)在这种情况下,identity尝试匹配所有内容,找到不同的row.names,您可以从dput看到:

> dput(df[1,])
structure(list(x = structure(1L, .Label = c("x", "y"), class = "factor"), 
    y = structure(2L, .Label = c("x", "y"), class = "factor")), .Names = c("x", 
"y"), row.names = 1L, class = "data.frame")
> dput(df[2,])
structure(list(x = structure(1L, .Label = c("x", "y"), class = "factor"), 
    y = structure(2L, .Label = c("x", "y"), class = "factor")), .Names = c("x", 
"y"), row.names = 2L, class = "data.frame")

在此示例中,一个简单的==可以工作:

> df[1,]==df[2,]
     x    y
1 TRUE TRUE