关于“==”运算符的行为的解释

时间:2015-06-30 22:31:07

标签: r

在下面这个非常简单的例子中,我无法理解“==”运算符的行为。

A <- c(10, 20, 10, 10, 20, 30)
B <- c(40, 50, 60, 70, 80, 90)

df <- data.frame(A, B)

df[df$A == c(10,20), ]      # it returns 3 lines instead of 5
df[df$A %in% c(10,20), ]    # it works properly and returns 5 lines

先谢谢大家。

2 个答案:

答案 0 :(得分:10)

要了解发生了什么,您必须了解数据框架结构和回收规则。数据框只是一个向量列表。

> unclass(df)
$A
[1] 10 20 10 10 20 30

$B
[1] 50 60 50 40 70 80

attr(,"row.names")
[1] 1 2 3 4 5 6

如果比较R中不同长度的两个向量,则较短的一个是recycled。在您的情况下,df$A == c(10,20)相当于:

> c(10, 20, 10, 10, 20, 30) == c(10, 20, 10, 20, 10, 20)
[1]  TRUE  TRUE  TRUE FALSE FALSE FALSE

> df[c(TRUE, TRUE, TRUE, FALSE, FALSE, FALSE), ]
   A  B
1 10 50
2 20 60
3 10 50

来自%in% documentation

  

%in%返回一个逻辑向量,指示是否匹配   它的左操作数

> df$A %in% c(10,20)
[1]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE

> df[c(TRUE, TRUE, TRUE, TRUE, TRUE, FALSE), ]
   A  B
1 10 50
2 20 60
3 10 50
4 10 40
5 20 70

答案 1 :(得分:3)

这是我的解决方案,我希望为其他(非常好的)答案添加一些见解。如&#34; R编程的艺术&#34;作者:Norman Matloff:

  

将操作应用于需要它们的两个向量时   相同的长度,R自动回收或重复较短的,   直到它足够长以匹配较长的

如果概念仍然不明确。看看这个并尝试猜测输出:

c(10, 10, 10, 10, 10, 10) == c(10, 20)

将给出:

[1]  TRUE FALSE  TRUE FALSE  TRUE FALSE

因为它会回收&#34;更短的&#34;矢量,通过这样做,它将右边的第一个10与左边的第一个({&#39; s TRUE)进行比较,但将第二个十分与20分(第二个元素)进行比较。右边的矢量)和那个FALSE;之后,R回收较短的矢量(右边的那个),游戏再次开始。

相关问题