【问题标题】:R if else statement multiple conditionsR if else语句多个条件
【发布时间】:2014-09-06 02:52:31
【问题描述】:

我正在尝试开发一个 if else 语句以应用于我下面的 data.frame。这些是我要考虑的条件:

  1. 如果“Year”中的年份=或>“YearLimitA”或“YearLimitB”中较大的年份值,则“Value”中的值保持不变。
  2. 如果“Year”中的年份或=“YearLimitA”或“YearLimitB”中的另一个年份值,则“值”需要除以 2。
  3. 如果“Year”中的年份

如果您对执行此操作的最佳方式有任何想法,我将不胜感激。当有多个条件时,我不确定从哪里开始。

示例 df:

名称 值 年份 YearLimitA 年限B df

if else 语句后的预期 df:

名称 值 年份 YearLimitA YearLimitB df2

【问题讨论】:

  • 不完全。如果条件 2 为真,“值”除以 2。如果条件 1 为真,“值”保持不变。它的措辞可以更好;我会编辑它。

标签: r if-statement


【解决方案1】:

试试这个:

 df <- df[df$Year >= pmin(df$YearLimitA, df$YearLimitB),]
 df$Value <- with(df, ifelse(Year>=pmax(YearLimitA, YearLimitB), Value, Value/2))

首先,我们只保留Year 至少与YearLimitAYearLimitB 的最小值一样大的行。然后,如果Year 至少与这两个变量的成对最大值一样大,则保留该值。如果不是,则除以2。

这会产生

    Name Value Year YearLimitA YearLimitB
 2    t1   1.3 2001       2001       2002
 3    t1   3.2 2002       2001       2002
 4    t1   4.1 2003       2001       2002
 6    t2   3.4 2002       2002       2002
 7    t2   2.4 2003       2002       2002
 9    t3   2.0 2001       2002       2001
 10   t3   1.9 2002       2002       2001
 11   t3   2.3 2003       2002       2001

all.equal(df2, df, check.attributes=F) 给出TRUE

【讨论】:

  • Sven 还指出条件一的措辞不佳。我已经对其进行了编辑,并希望它能解决不一致的问题。在您的代码中,是否保留第 1 行,然后将第 2 行更改为: df$Value = pmax(df$YearLimitA, df$YearLimitB), Value, Value/2) )
  • 查看我的编辑,我在其中考虑到了这一点,并且还修复了一些错别字。
【解决方案2】:

这是一种方法:

# sort years
rangeYear <- apply(df[c("YearLimitA", "YearLimitB")], 1, range)
# remove colums
idx <- df$Year >= rangeYear[1, ]
df2 <- df[idx, ]
# change values
df2 <- transform(df2, Value = Value / (1 + (Year < rangeYear[2, ][idx])))

结果:

   Name Value Year YearLimitA YearLimitB
2    t1   1.3 2001       2001       2002
3    t1   3.2 2002       2001       2002
4    t1   4.1 2003       2001       2002
6    t2   3.4 2002       2002       2002
7    t2   2.4 2003       2002       2002
9    t3   2.0 2001       2002       2001
10   t3   1.9 2002       2002       2001
11   t3   2.3 2003       2002       2001

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-18
    • 2018-09-24
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多