R if else声明多个条件

时间:2014-07-15 19:06:49

标签: r if-statement

我正在尝试开发一个if else语句来应用于我的data.frame。这些是我试图解释的条件:

  1. 如果“年”中的年份是=或> “YearLimitA”或“YearLimitB”中较大的年份值,则“值”中的值保持不变。
  2. 如果“年”中的年份是< “YearLimitA”或“YearLimitB”中的年度值之一,但是>或者=“YearLimitA”或“YearLimitB”中的其他年份值,“值”中的值需要除以2.
  3. 如果“年”中的年份是< “YearLimitA”和“YearLimitB”中的年份值,则应删除“值”(实际上是整行)中的值。
  4. 如果您对最佳方法有任何想法,我将非常感激。当有多种情况时,我不确定从哪里开始。

    示例df:

      

    名称< - c(“t1”,“t1”,“t1”,“t1”,“t2”,“t2”,“t2”,“t3”,“t3”,“t3”,“ T3" )
      值< -c(1.7,2.6,3.2,4.1,1.8,3.4,2.4,3.6,4.0,1.9,2.3)
      年< - c(2000年,2001年,2002年,2003年,2001年,2002年,2003年,2000年,2001年,2002年,2003年)   YearLimitA< - c(2001,2001,2001,2001,2002,2002,2002,2002,2002,2002,2002)
      YearLimitB< - c(2002,2002,2002,2002,2002,2002,2002,2001,2001,2001,2001)
      df< - data.frame(Name,Value,Year,YearLimitA,YearLimitB)

    在if else语句之后的预期df:

      

    名称< - c(“t1”,“t1”,“t1”,“t2”,“t2”,“t3”,“t3”,“t3”)
      值< -c(1.3,3.2,4.1,3.4,2.4,2.0,1.9,2.3)
      年< - c(2001,2002,2003,2002,2003,2001,2002,2003)
      YearLimitA< -c(2001,2001,2001,2002,2002,2002,2002,2002)
      YearLimitB< - c(2002,2002,2002,2002,2002,2001,2001,2001)
      df2< - data.frame(Name,Value,Year,YearLimitA,YearLimitB)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

这是一种方法:

# 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