在R中子集多列-更优雅的代码?

在R中子集多列-更优雅的代码?,r,subset,R,Subset,我正在根据多个条件跨多个列对数据帧进行子集设置。我正在选择数据框中的行,这些行包含向量“criteria”中定义的三个不同列中的任意一个值 我有一些代码可以工作,但不知道还有什么其他(更优雅的?)方法可以做到这一点。以下是我所做的: criteria <-c(1:10) subset1 <-subset(data, data[, "Col1"] %in% criteria | data[, "Col2"] %in% criteria | data[, "Col3"] %in% cr

我正在根据多个条件跨多个列对数据帧进行子集设置。我正在选择数据框中的行,这些行包含向量“criteria”中定义的三个不同列中的任意一个值

我有一些代码可以工作,但不知道还有什么其他(更优雅的?)方法可以做到这一点。以下是我所做的:

criteria <-c(1:10)
subset1 <-subset(data, data[, "Col1"] %in% criteria | data[, "Col2"]
 %in% criteria | data[, "Col3"] %in% criteria)

标准我使用
DF
而不是
数据
作为示例

DF[apply(apply(as.matrix(DF[c("Col1","Col2","Col3")]), 
               c(1,2), `%in%`, criteria), 
         1, any),]
有关此操作的详细信息,请参见:

制作指定列的矩阵,如果矩阵中的每个元素包含一个标准,则对其进行测试。然后,对于该矩阵的每一行,查看是否有任何行元素为
TRUE
。如果是,则保留原始数据集的对应行

通过一个例子:

从虚拟数据开始:

DF <- data.frame(Col1=seq(1, by=2, length=10),
                 Col2=seq(3, by=3, length=10),
                 Col3=seq(7, by=1, length=10),
                 other=LETTERS[1:10])
只拉出感兴趣的列

> as.matrix(DF[c("Col1","Col2","Col3")])
      Col1 Col2 Col3
 [1,]    1    3    7
 [2,]    3    6    8
 [3,]    5    9    9
 [4,]    7   12   10
 [5,]    9   15   11
 [6,]   11   18   12
 [7,]   13   21   13
 [8,]   15   24   14
 [9,]   17   27   15
[10,]   19   30   16
对照标准检查每个条目

> apply(as.matrix(DF[c("Col1","Col2","Col3")]), c(1,2), `%in%`, criteria)
       Col1  Col2  Col3
 [1,]  TRUE  TRUE  TRUE
 [2,]  TRUE  TRUE  TRUE
 [3,]  TRUE  TRUE  TRUE
 [4,]  TRUE FALSE  TRUE
 [5,]  TRUE FALSE FALSE
 [6,] FALSE FALSE FALSE
 [7,] FALSE FALSE FALSE
 [8,] FALSE FALSE FALSE
 [9,] FALSE FALSE FALSE
[10,] FALSE FALSE FALSE
测试行中的任何值是否为真

> apply(apply(as.matrix(DF[c("Col1","Col2","Col3")]), c(1,2), `%in%`, criteria), 1, any)
 [1]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE
使用它来索引原始数据帧

> DF[apply(apply(as.matrix(DF[c("Col1","Col2","Col3")]), c(1,2), `%in%`, criteria), 1, any),]
  Col1 Col2 Col3 other
1    1    3    7     A
2    3    6    8     B
3    5    9    9     C
4    7   12   10     D
5    9   15   11     E

我不确定您是否需要两个
apply
呼叫:

# Data
df=data.frame(x=1:4,Col1=c(11,12,3,13),Col2=c(9,12,10,13),Col3=c(9,13,42,23))
criteria=1:10

# Solution
df[apply(df [c('Col1','Col2','Col3')],1,function(x) any(x %in% criteria)),]
除非你想写很多列,否则说:

subset(df, Col1 %in% criteria | Col2 %in% criteria | Col3 %in% criteria) 

请注意,
子集的手册页
警告不要以编程方式使用它,因为它使用非标准评估。我在“帮助”页上阅读了该警告,但我不知道它的含义。为什么“非标准评估”会成为一个问题?在我的例子中,我只是将数据分段以创建一些描述性统计数据,所以我不认为“子集”会给我带来问题。。。但在什么情况下会引起问题?谢谢
subset(df, Col1 %in% criteria | Col2 %in% criteria | Col3 %in% criteria)