R_u*_*233 5 filtering r operators
我的问题涉及R中运算符==和%in%运算符之间的实际差异.
我遇到了一个工作实例,其中使用任一运算符进行过滤会得到不同的结果(例如,一行结果为800行,另一行结果为1200行).我在过去遇到过这个问题,并且能够以确保我得到我想要的结果的方式进行验证.但是,我仍然对它们的不同之处感到困惑.
有人可以说明这些运营商的不同之处吗?
d.b*_*d.b 12
%in%是值匹配并且"返回其第一个参数在其第二个参数中的(第一个)匹配位置的向量"(参见help('%in%'))这意味着您可以比较不同长度的向量,以查看一个向量的元素是否与另一个向量中的至少一个元素匹配.输出的长度将等于被比较的矢量的长度(第一个).
1:2 %in% rep(1:2,5)
#[1] TRUE TRUE
rep(1:2,5) %in% 1:2
#[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
#Note this output is longer in second
Run Code Online (Sandbox Code Playgroud)
==是逻辑运算符,用于比较两个事物是否完全相等.如果向量长度相等,则元素将按元素进行比较.如果没有,矢量将被回收.输出长度等于较长矢量的长度.
1:2 == rep(1:2,5)
#[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
rep(1:2,5) == 1:2
#[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
Run Code Online (Sandbox Code Playgroud)
1:10 %in% 3:7
#[1] FALSE FALSE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE
#is same as
sapply(1:10, function(a) any(a == 3:7))
#[1] FALSE FALSE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)
注意:如果可能,请尝试使用identical或all.equal代替==和.
小智 12
给定两个向量 x 和 y,代码x == y将比较 x 的第一个元素与 y 的第一个元素,然后将 x 的第二个元素与 y 的第二个元素进行比较,依此类推。使用 x == y 时,x 和 y 的长度必须相同。这里,比较的意思是“等于”,因此输出是一个等于 x(或 y)长度的逻辑向量。
在代码x %in% y 中,x 的第一个元素与y 中的所有元素进行比较,然后 x 的第二个元素与y 中的所有元素进行比较,依此类推。在这里,比较意味着“x 的当前元素等于 y 中的任何值”,因此输出是一个逻辑向量,其长度与 x 相同,而不是(必然)y。
这是一个说明差异的代码片段。请注意,x 和 y 具有相同的长度,但 y 的元素是以不同顺序排列的 x 元素。还要注意在最后的示例中,x 是一个 3 元素向量,与包含 26 个元素的字母向量进行比较。
> x <- c('a','b','c')
> y <- c('c', 'b', 'a')
> x == y
[1] FALSE TRUE FALSE
> x %in% y
[1] TRUE TRUE TRUE
> x %in% letters
[1] TRUE TRUE TRUE
> letters %in% x
[1] TRUE TRUE TRUE FALSE FALSE FALSE
[7] FALSE FALSE FALSE FALSE FALSE FALSE
[13] FALSE FALSE FALSE FALSE FALSE FALSE
[19] FALSE FALSE FALSE FALSE FALSE FALSE
[25] FALSE FALSE
Run Code Online (Sandbox Code Playgroud)
尝试不同长度的物体。
ac <- c("a", "b", "c")
ae <- c("a", "b", "c", "d", "e")
ac %in% ae
[1] TRUE TRUE TRUE
ac == ae
[1] TRUE TRUE TRUE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)
很明显,%in%检查对象是否包含在另一个对象中。而==是检查身份属性的逻辑运算符。