我正在尝试在数据框中查找某些值的所有实例,并将它们替换为 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
最佳答案
如果我们查看 %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
s 而不是 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
关于R 使用 | 在数据框中查找值运算符 vs %in%,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47538001/