关于"=="运算符的行为的解释

Apo*_*los 7 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
Run Code Online (Sandbox Code Playgroud)

大家先谢谢大家.

zer*_*323 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
Run Code Online (Sandbox Code Playgroud)

如果比较R中不同长度的两个向量,则将较短的向量再循环.在你的情况下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
Run Code Online (Sandbox Code Playgroud)

> df[c(TRUE, TRUE, TRUE, FALSE, FALSE, FALSE), ]
   A  B
1 10 50
2 20 60
3 10 50
Run Code Online (Sandbox Code Playgroud)

%in%文档:

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

> df$A %in% c(10,20)
[1]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE
Run Code Online (Sandbox Code Playgroud)

> 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
Run Code Online (Sandbox Code Playgroud)