如何计算一列中每月发生的次数并根据结果修改另一列

时间:2019-04-12 14:28:07

标签: r if-statement count conditional-statements find-occurrences

我是R语言的新手,但是有问题。我有一个包含超过80000个条目的CSV数据框。我有一个用0和1填充的列(maj),该列包含一年中的每一天,还有一个列有每日价格的列(以及其他列)。当maj = 1时,表示当天价格已完成更新。 我想做的是: 如果过去30天内maj = 0,则必须将价格替换为“不适用”

这是我df的示例:

      day       maj     price
   2019-01-02    1      1435
   2019-01-03    0      1435
   2019-01-04    0      1435
   2019-01-05    0      1435

例如,如果介于2019-01-03和2019-02-03 maj = 0之间,我要用不适用的价格将2019-02-04及之后的所有价格替换为maj =再次1。

我没有任何要显示的代码,因为当我看到什么都没用时,我将其删除了。 我用Zoo包尝试了rollapplyr,它创建了一个函数和值来滚动每月总和,但我不明白。

有人知道怎么做吗?

谢谢

1 个答案:

答案 0 :(得分:0)

使用最后在“注释”中可重复显示的DF,如果最近n天中有1,则使用rollapplyr返回TRUE,否则返回FALSE。然后使用ifelse将TRUE转换为1,将FALSE转换为NA。该问题未指定如何处理前n-1个元素,但在下面我们用1填充它们。 (替代方案为fill=NApartial=TRUE,如果少于n,则最后一种替代方案将适用于任何数量的元素。

library(zoo)

# n <- 30
n <- 3

transform(DF, price = price * ifelse(rollapplyr(maj, n, any, fill = 1), 1, NA))

给予:

         day maj price
1 2019-01-02   1  1435
2 2019-01-03   0  1435
3 2019-01-04   0  1435
4 2019-01-05   0    NA

注意

Lines <- "day       maj     price
2019-01-02    1      1435
2019-01-03    0      1435
2019-01-04    0      1435
2019-01-05    0      1435"
DF <- read.table(text = Lines, header = TRUE, strip.white = TRUE)
DF$day <- as.Date(DF$day)