将条件指定为变量以对R中的数据帧进行子集化

时间:2011-06-24 00:54:23

标签: r

假设我有一个数据框,df有30列:A1A30。我知道我可以通过编写如下命令来配置此数据框:

 filteredrows = subset(df, A1 == 30 & A2 == 2 & A3 == "this")

上面的示例根据三列中的值过滤数据,但我必须对大约12列的值执行此操作。在subset()函数中写入这12个值会使它太长。为了使代码更清晰,有没有办法可以将条件指定为变量或函数,然后使用它指定子集函数中的条件。有类似以下内容吗?

x = (A1 == 30 & A2 == 2 & A3 == "this")
filteredrows = subset(df, x)

提前致谢。

2 个答案:

答案 0 :(得分:4)

您可以将条件指定为expression,然后使用eval将其传递给子集:

d <- data.frame(x=letters[1:10],y=runif(10))
ss <- expression(x == "a")
subset(d, eval(ss))

答案 1 :(得分:0)

您的建议几乎有效,当您获得with时,只需x

> df <- expand.grid(A1=(1:3)*10,A2=1:3,A3=c("this","that"))
> x <- with(df, (A1 == 30 & A2 == 2 & A3 == "this"))
> subset(df, x)
  A1 A2   A3
6 30  2 this

您也可以通过这种方式获得子集。

> df[x,]
  A1 A2   A3
6 30  2 this

您可能还想将x放入数据框df;否则重新排序数据框可能会搞砸了,比如

df$x <- with(df, (A1 == 30 & A2 == 2 & A3 == "this"))
subset(df,x)