【问题标题】:specifying conditions as a variable to subset a data frame in R将条件指定为变量以对 R 中的数据框进行子集化
【发布时间】:2011-06-24 00:54:23
【问题描述】:

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

提前致谢。

【问题讨论】:

    标签: r


    【解决方案1】:

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

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

    【讨论】:

    • 我无法确定这种技术是漂亮还是糟糕。
    • @hadley - :shrug: 只是我脑海中第一件事就是按照 OP 的要求去做。但你是专家,不是我。我喜欢学习:为什么它很糟糕?我很乐意用一种更好的方法来投票回答这个问题,以解释为什么这个方法不好。
    • 它很漂亮,因为它有效,而且我可以看到任何更简单的方法。这很糟糕,因为有两组引用和评估——你的和子集中的。
    • @hadley - 如果您认为这通常不是一个好习惯,请让我知道执行此操作的“正确”方法。可以在列表中指定限制吗?
    • “正确”的方式,如果它甚至是合理的大胆,可能是按照你最初的建议去做。我不清楚你为什么认为它太长了,为什么还有其他东西会更干净。当我做这样的事情时,通常是因为出于某种原因我将多次执行子集,在这种情况下,按照我的建议将集合放入数据框中可能是一个不错的选择。
    【解决方案2】:

    您的建议几乎奏效了,当您收到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)
    

    【讨论】:

    • 谢谢亚伦。但是,这对我不起作用,因为我想指定条件,而与数据框的名称无关。
    • 哦,我的第一次投反对票! (当然不是我/真的/在乎...)
    猜你喜欢
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    • 2016-08-08
    • 2013-06-08
    • 2021-12-04
    相关资源
    最近更新 更多