在R中子集多列-更优雅的代码?
我正在根据多个条件跨多个列对数据帧进行子集设置。我正在选择数据框中的行,这些行包含向量“criteria”中定义的三个不同列中的任意一个值 我有一些代码可以工作,但不知道还有什么其他(更优雅的?)方法可以做到这一点。以下是我所做的:在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 <-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)