首页 文章

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

提问于
浏览
3

假设我有一个数据框, 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 回答

  • 4

    你的建议几乎可行,当你得到 x 时,你只需要 with .

    > 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)
    
  • 0

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

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

相关问题