检查列表中的某个值是否存在于多列R数据表中



问题

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

示例

假设我们有一个包含因子类型DAS1DAS2DAS3的3个变量的数据集。这些变量的可能值是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"))

我的目标是找出哪一行至少包含一个值"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))

条件

我真的很想用data.table包而不是dplyr,因为我主要使用data.table,如果没有必要,我不喜欢在两个包之间切换。

由@lovalery回答

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

你可以做:

Reprex

  • 代码
library(data.table)
start[, xy := apply(start,1, function(x) any(x == "x" | x == "y"))][]
  • 输出
#>    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

创建于2022-03-04由reprex包(v2.0.1(

你可以试试这个

> start[, xy := rowSums((.SD == "x") + (.SD == "y")) > 0][]
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

> start[, xy := rowSums(Reduce(`+`, Map(`==`, c("x", "y"), list(.SD)))) > 0][]
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

相关内容

最新更新