R使用|在数据框中查找值运算符vs%in%

时间:2017-11-28 17:53:59

标签: r

我正在尝试在数据框中查找某些值的所有实例,并将其替换为NA。我尝试了两种不同的方式,我认为是相同的,但我得到了不同的结果。例如:

df <- data.frame(a=c(1,2),b=c(3,4))
df[df == 1 | df == 4] <- NA

给了我预期的结果:

df
#    a  b
# 1 NA  3
# 2  2 NA

,而

df <- data.frame(a=c(1,2),b=c(3,4))
df[df %in% c(1,4)] <- NA

什么都不做:

df
#    a b
# 1  1 3
# 2  2 4

这似乎是因为如果我使用“|”运算符,它逐个元素地搜索数据帧,而如果我使用%in%,它按矢量(逐列)搜索数据帧矢量,但我不明白为什么。

df <- data.frame(a=c(1,2),b=c(3,4))
df == 1 | df == 4
#         a     b
# [1,]  TRUE FALSE
# [2,] FALSE  TRUE

df %in% c(1,4)
# [1] FALSE FALSE

2 个答案:

答案 0 :(得分:3)

如果我们查看%in%

的代码
function (x, table) 
 match(x, table, nomatch = 0L) > 0L

所以,它基本上是matchmatch的输出将是

match(c(1,4), df, nomatch = 0L) > 0L
#[1] FALSE FALSE

%in%适用于vector而不是data.frame。因此,我们使用lapply遍历列,然后执行%in%

lapply(df, `%in%`, c(1, 4))

如果我们需要matrix的方式,请使用sapply

df[sapply(df, `%in%`, c(1, 4))] <- NA

我们可以查看match

上的vector作品
sapply(df, match, x = c(1,4), nomatch = 0L) > 0
#         a     b
#[1,]  TRUE FALSE
#[2,] FALSE  TRUE

答案 1 :(得分:2)

-gui仅适用于矢量。为了在数据帧上执行它,您必须使用%in%在每个列上应用函数。

sapply