Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 对「==&引用;操作人员_R - Fatal编程技术网

R 对「==&引用;操作人员

R 对「==&引用;操作人员,r,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 li

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

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

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

> 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中两个不同长度的向量,则较短的向量为。在您的情况下,
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

从:

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


以下是我的解决方案,我希望能为其他(非常好的)答案添加一些见解。正如诺曼·马特洛夫在《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循环使用较短的向量(右边的向量),游戏再次开始。

我不知道循环使用的相关内容。谢谢你,zero323。非常类似于:对于读者来说,这可能有什么用处?两个示例:1)从列表向量
向量[c(T,F)]
中获取奇数元素,每三个元素
向量[c(F,F,T)]
2)快速填充data.frame/matrix
data.frame(class=“a”,values=rnorm(100))
> 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
c(10, 10, 10, 10, 10, 10) == c(10, 20)
[1]  TRUE FALSE  TRUE FALSE  TRUE FALSE