检查列表中的值是否存在于 R data.table 的多列中

Kév*_*ult 2 r data.table

问题

我有一个数据集,其中包含许多相同类型的变量,这些变量可以包含相同的值。我想检查在这些变量中,我们是否可以在一系列值中找到一个值。

例子

假设我们有一个包含 3 个因子类型变量DAS1, DAS2,的数据集DAS3。这些变量的可能值是c("0", "1", "x", "y")(请注意,我并不是试图区分数字和字母。将每个值视为字符)。

library(data.table)

start <- data.table::data.table(DAS1 = c("0","1","x","0","1","0","1"),
                       DAS2 = c("x","y","0","0","x","1","0"),
                       DAS3 = c("1","1","y","1","x","y","0"))
Run Code Online (Sandbox Code Playgroud)

我的目标是找到哪一行包含至少一个值"x"或的观察值"y"

result <- data.table::data.table(DAS1 = c("0","1","x","0","1","0","1"),
                       DAS2 = c("x","y","0","0","x","1","0"),
                       DAS3 = c("1","1","y","1","x","y","0"),
                       xy = c(T,T,T,F,T,T,F))
Run Code Online (Sandbox Code Playgroud)

健康)状况

我真的想用这个包来做这data.table件事,而不是dplyr因为我主要使用data.table并且如果没有必要的话我不喜欢在两个包之间切换。

由@lovalery 回答

start[, xy := apply(start[,c("DAS1", "DAS2", "DAS3")],1, function(x) any(x %in% c("x", "y")))][]
Run Code Online (Sandbox Code Playgroud)

lov*_*ery 5

你可以这样做:

雷普莱克斯

  • 代码
library(data.table)

start[, xy := apply(start,1, function(x) any(x == "x" | x == "y"))][]
Run Code Online (Sandbox Code Playgroud)
  • 输出
#>    DAS1 DAS2 DAS3    xy
#> 1:    0    x    1  TRUE
#> 2:    1    y    1  TRUE
#> 3:    x    0    y  TRUE
#> 4:    0    0    1 FALSE
#> 5:    1    x    x  TRUE
#> 6:    0    1    y  TRUE
#> 7:    1    0    0 FALSE
Run Code Online (Sandbox Code Playgroud)

由reprex 包于 2022 年 3 月 4 日创建(v2.0.1)

  • 根据“microbenchmark”,您的解决方案比“rowSums”快一点 (2认同)