【问题标题】:R finding values in a data frame using | operator vs %in%R 使用 | 在数据框中查找值运算符 vs %in%
【发布时间】:2017-11-28 17:53:59
【问题描述】:

我正在尝试在数据框中查找某些值的所有实例,并将它们替换为 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% 无法在 data.frame 中以您想要的方式工作。它适用于向量

标签: r


【解决方案1】:

如果我们查看%in%的代码

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

所以,它基本上是在做一个matchmatch 的输出将是

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

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

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

如果我们需要matrix,那么使用sapply

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

我们可以检查matchvector 上的工作

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

【讨论】:

    【解决方案2】:

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

    df[sapply(df, function(x) x %in% c(1, 4))] <- NA
    
       a  b
    1 NA  3
    2  2 NA
    

    【讨论】:

      猜你喜欢
      • 2016-01-29
      • 2016-12-06
      • 2022-01-01
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      • 2016-04-09
      相关资源
      最近更新 更多