【问题标题】:Conditional subsetting in R based on a value in another data frameR中基于另一个数据帧中的值的条件子集
【发布时间】:2014-07-11 14:36:04
【问题描述】:

我想根据另一个数据帧中的值对一个数据帧进行子集化(这很容易)。最重要的是,我想告诉 R,如果第二个 df 中的值高于某个水平,那么子集应该包含第一个 df 中的所有值。 这是一口,所以这里有一个例子:

DF1 看起来像这样:

|   date    |  value |
----------------------
| Jul 1     |  1     |
| Jul 2     |  2     |
| Jul 3     |  3     |
| Jul 4     |  4     |

为简单起见,假设 DF2 看起来像这样

value=99
df2<-data.frame(value)

再次,我想告诉 R,如果 df2 中的值大于 5,那么 df1 的子集应该包含值 1、2、3、4。

这是我正在尝试但不起作用的方法:

subset(df1, value %in% ifelse(df2$value[1]>5, c(1,2,3,4), df2$value[1]))

你能帮忙吗? 另外,如果您能解释为什么上述代码不起作用,请补充几点。

干杯!

【问题讨论】:

  • 在你尝试的代码中,values 应该是value吗?
  • 是的,这是一个错字。刚刚修好了。不过,这不是问题的根源。
  • ifelse 中的另一个问题是:测试是(原子)逻辑(TRUE 或 FALSE),而(可能是预期的,但失败的)结果是长度为 4 的向量: ? ifelse: "ifelse(test, yes, no): Value: 一个与 test 长度和属性(包括维度和“类”)相同的向量”
  • 感谢您的评论,@Martin。我知道 ifelse 部分是破坏链条的原因。你能建议如何让它工作吗?
  • 我还是不明白这个计算的真正目的,但是这样做有用吗?我只是将 ifelse 扩展为 if ... else 构造并应用了一个临时变量: if(df2$value[1]>5) temp

标签: r subset


【解决方案1】:

对我来说

subset(df1, value %in% (if (df2$value[1]>99)  c(0,1,2,3) else (df2$value[1])))

施展了魔法。

【讨论】:

    【解决方案2】:

    用普通的 if() 而不是 ifelse() 怎么样。

    例如:

    if(F) c(1:4) else 99 # returns 99
    if(T) c(1:4) else 99 # returns vector c(1:4)
    

    【讨论】:

    • 非常感谢您的意见。我自己也弄明白了;)干杯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 2020-11-10
    • 2019-10-22
    • 2013-06-14
    • 2017-11-10
    • 1970-01-01
    相关资源
    最近更新 更多