【问题标题】:An explanation on the behaviour of the "==" operator关于“==”操作符行为的解释
【发布时间】:2015-09-17 22:07:49
【问题描述】:

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

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

提前谢谢大家。

【问题讨论】:

标签: r


【解决方案1】:

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

> 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

【讨论】:

  • 我对回收一无所知。谢谢 zero323。
【解决方案2】:

这是我的解决方案,我希望为其他(非常好的)答案添加一些见解。正如 Norman Matloff 在“R 编程的艺术”中所述:

当对两个向量应用运算时,要求它们是 同样的长度,R自动循环,或者重复,较短的那个, 直到它足够长以匹配更长的那个

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

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

这将给出:

[1]  TRUE FALSE  TRUE FALSE  TRUE FALSE

因为它回收了“更短”的向量,并通过这样做将右侧的第一个 10 与左侧的第一个(即 TRUE)进行比较,但将第二个 10 与 20(第二个元素右边的向量),那是FALSE;之后,R 循环使用较短的向量(即右侧的向量),游戏重新开始。

【讨论】:

  • 对于那些问这怎么可能有用的读者?两个例子:1)从列表向量vector[c(T, F)]中获取奇数元素,每第三个元素获取vector[c(F,F,T)] 2)快速填充data.frame/matrix data.frame(class = "A", values = rnorm(100))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
  • 1970-01-01
  • 2015-12-06
相关资源
最近更新 更多