【问题标题】:ifelse conditional formatting in rr中的ifelse条件格式
【发布时间】:2016-03-07 05:18:30
【问题描述】:

我对 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 个)

一个。 dlq = 1 如果价格 = NA 在周期等于 M 的一个月内或

b. dlq = 1 如果周期等于 O & 价格 = NA 并且最近一个月周期 = M 价格 = NA。

c。否则 dlq = 0。

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

【问题讨论】:

  • 你的价格变量应该是数字,是吗?
  • 是的@rawr 它应该是数字,尽管有 NA 值
  • @rawr 我刚刚编辑了这个问题,很抱歉造成混乱。我错过了一个附加条件。
  • irm 当前是一个因子变量。如果您希望将其用作日期,则需要进行一些数据处理。之后,这是一个相对简单的 split-apply-combine 案例,我建议 library(data.table)library(dplyr)。 IE-编写一个适用于单个itemcode然后DT[, func(.SD), by= itemcode]的函数
  • @Alex 我不确定我理解你所说的“数据处理”是什么意思。你是说进程 irm as.date 吗?

标签: r if-statement conditional-statements


【解决方案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

【讨论】:

  • 这很好,但它似乎不适用于条件 b。我不太确定为什么它在这个例子中有效,而不是我的完整数据框。也许是因为它不使用 irm 作为日期?
  • 好吧irm 不是日期或类似日期的任何东西。这是一个字符向量。
  • 对不起,这是约会。你认为这会有所帮助吗?
  • 我不知道。由于问题的初始版本将它作为一个字符,并且它似乎依赖于一个简单的行序列,因此没有检查与日期相关的问题。如果您的记录中存在空白,那么它会更加复杂,您需要定义所有将出现的问题。
【解决方案2】:
> 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

不知道是不是我理解错了?

【讨论】:

  • 谢谢,但这不起作用。对于 irm = 200907,dlq 应该是 1。这可能是因为 irm 没有用作日期,但我还不确定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
  • 1970-01-01
相关资源
最近更新 更多