我正在尝试在数据框中查找某些值的所有实例,并将其替换为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
答案 0 :(得分:3)
如果我们查看%in%
function (x, table)
match(x, table, nomatch = 0L) > 0L
所以,它基本上是match
。 match
的输出将是
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