我是R的新人,我有一个问题。我有一个包含80000多个条目的CSV数据框。我有一个填充0和1的列(maj),一年中每天的列,以及每天价格(和其他列)的列。当maj = 1时,表示当天已完成价格更新。我想要做的是:如果在过去30天内maj = 0,价格必须被“N / A”取代
这是我的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及以下所有的价格替换为N / A,直到maj = 1为止。
我没有任何代码可以显示,因为当我看到没有任何工作时我删除了它。我尝试了rollapplyr与动物园包,它创建了一个函数和值来滚动每月总和,但我不明白。
有谁知道怎么做?
谢谢,
使用DF
在最后的Note中可重复使用rollapplyr如果在最后n天有任何1,则返回TRUE,否则返回FALSE。然后使用ifelse
将TRUE转换为1,将FALSE转换为NA。问题没有说明如何处理前n-1个元素,但在下面我们用1填充它们。 (替代方案是fill=NA
或partial=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)