R if else语句有多个条件

R if else语句有多个条件,r,if-statement,R,If Statement,我正在尝试开发一个if-else语句来应用于下面的data.frame。以下是我试图解释的情况: 如果“year”中的年份=或>较大的“YearLimitA”或“YearLimitB”中的年份值,则“value”中的值保持不变 如果“year”中的年份小于“YearLimitA”或“YearLimitB”中的一个年份值,但大于或等于“YearLimitA”或“YearLimitB”中的另一个年份值,“value”中的值需要除以2 如果“year”中的年份小于“YearLimitA”和“YearL

我正在尝试开发一个if-else语句来应用于下面的data.frame。以下是我试图解释的情况:

  • 如果“year”中的年份=或>较大的“YearLimitA”或“YearLimitB”中的年份值,则“value”中的值保持不变
  • 如果“year”中的年份小于“YearLimitA”或“YearLimitB”中的一个年份值,但大于或等于“YearLimitA”或“YearLimitB”中的另一个年份值,“value”中的值需要除以2
  • 如果“year”中的年份小于“YearLimitA”和“YearLimitB”中的年份值,则应删除“value”中的值(实际上是整行)
  • 如果你对最好的方法有什么想法,我会非常感激。我不确定在有多个条件的情况下从哪里开始

    示例df:

    Name试试这个:

     df <- df[df$Year >= pmin(df$YearLimitA, df$YearLimitB),]
     df$Value <- with(df, ifelse(Year>=pmax(YearLimitA, YearLimitB), Value, Value/2))
    
    all.equal(df2,df,check.attributes=F)
    给出
    TRUE

    以下是一种方法:

    # 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])))
    

    不完全是。如果条件2为真,“值”除以2。如果条件1为真,“值”保持不变。可以用更好的措辞;我会编辑它。斯文还指出了条件一中糟糕的措辞。我已经编辑了它,希望它能修复不一致性。在您的代码中,是否保留第1行,然后将第2行更改为:df$Value=pmax(df$YearLimitA,df$YearLimitB),Value,Value/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