假设我有一个数据框,df
有30列:A1
到A30
。我知道我可以通过编写如下命令来配置此数据框:
filteredrows = subset(df, A1 == 30 & A2 == 2 & A3 == "this")
上面的示例根据三列中的值过滤数据,但我必须对大约12列的值执行此操作。在subset()函数中写入这12个值会使它太长。为了使代码更清晰,有没有办法可以将条件指定为变量或函数,然后使用它指定子集函数中的条件。有类似以下内容吗?
x = (A1 == 30 & A2 == 2 & A3 == "this")
filteredrows = subset(df, x)
提前致谢。
答案 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)