r中的ifelse条件格式

时间:2015-12-02 19:47:39

标签: r if-statement conditional-statements

我对R来说比较新。我有一个数据框,我想在其中创建一个执行条件格式的变量。以下是我正在使用的数据示例。

cycle <- c("M", "O", "O", "O", "O", "M", "O")
irm <- c("200901", "200902", "200903", "200904", "200905", "200906", "200907")
itemcode <- c("611420B004A01", "611420B004A01", "611420B004A01", "611420B004A01", "611420B004A01", "611420B004A01", "611420B004A01")
price <- c(19.00, NA, NA, NA, NA, NA, NA)
dlq <- c(0, 0, 0, 0, 0, 1, 1)
df <- data.frame(itemcode, irm, price, cycle, dlq)

dlq变量以循环变量的值为条件。我想定义它,对于itemcode的每个唯一值(我有75,000个)

  

一个。如果在周期等于M或

的月份中价格= NA,则dlq = 1      

湾如果周期等于O&amp;则dlq = 1 price = NA和最近一个月的周期= M price = NA。

     

℃。否则dlq = 0。

例如,dlq = 1其中irm = 200907因为200906中的周期= M并且价格等于NA并且在irm = 200907时它也是空的。我尝试使用超前和滞后变量,但是M和O之间的月数不是恒定的。所以,我希望dlq = 1当且仅当cycle =&#34; O&#34;而且,在周期= M的最后一个月,价格= NA。有没有办法用ifelse或其他条件做到这一点?任何建议/帮助将不胜感激。非常感谢。

2 个答案:

答案 0 :(得分:1)

> df$dlq[ is.na(df$price)&df$cycle=="M" ] <- 1
> df$dlq[ is.na(df$price) & df$cycle=="O" & 
          is.na( c(NA, head(df$price,-1))) & # The last two conditions use shifted values
          c(FALSE, head(df$cycle,-1)=="M")  ] <- 1
> df
  cycle    irm      itemcode price dlq
1     M 200901 611420B004A01    19   0
2     O 200902 611420B004A01    NA   0
3     O 200903 611420B004A01    NA   0
4     O 200904 611420B004A01    NA   0
5     O 200905 611420B004A01    NA   0
6     M 200906 611420B004A01    NA   1
7     O 200907 611420B004A01    NA   1

答案 1 :(得分:1)

> library('plyr');library('dplyr')
> df %>% tbl_df %>% mutate(dlq=ifelse((cycle=='M' & is.na(price))|((cycle=='O' & is.na(price)) & (cycle[nrow(.)]=='M' & is.na(price[nrow(.)]))),1,0))
Source: local data frame [7 x 5]

       itemcode    irm price  cycle   dlq
         (fctr) (fctr) (dbl) (fctr) (dbl)
1 611420B004A01 200901    19      M     0
2 611420B004A01 200902    NA      O     0
3 611420B004A01 200903    NA      O     0
4 611420B004A01 200904    NA      O     0
5 611420B004A01 200905    NA      O     0
6 611420B004A01 200906    NA      M     1
7 611420B004A01 200907    NA      O     0

不知道我是否误解了?