我是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,它创建了一个函数和值来滚动每月总和,但我不明白。
有人知道怎么做吗?
谢谢
答案 0 :(得分:0)
使用最后在“注释”中可重复显示的DF
,如果最近n天中有1,则使用rollapplyr返回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)