我有一个可以这样表示的数据框:
tdate <- rep(seq(as.Date("2000/1/1"),as.Date("2000/3/31"),"days"),3)
tcity <- c(rep("New York",91),rep("Boston",91),rep("Miami",91))
tval1 <- rep(seq(1,91,1),3)
tdf <- data.frame(tdate,tcity,tval1)
tval1列实际上是作为月份到日期值给出的。我想要撤消&#39;这个,并获得每个月我每个不同城市的价值。换句话说,tval1给我的方式是作为累积和,我想撤消该总和并得到各个值。由于它们是月初至今的值,因此每个月都会重置这些值。我想要的是&#39; ntval&#39;如下:
tdate tcity tval1 ntval
1 2000-01-01 New York 1 1
2 2000-01-02 New York 2 1
3 2000-01-03 New York 3 1
4 2000-01-04 New York 4 1
5 2000-01-05 New York 5 1
6 2000-01-06 New York 6 1
我可以使用for循环执行此操作,但这似乎是最糟糕的方法。没有for循环有没有办法做到这一点?
在逻辑上,我处于一个巨大的损失,如何处理时间序列。任何帮助和建议表示赞赏。谢谢!
答案 0 :(得分:1)
我不确定我完全理解。试试这个并让我知道它是否有效
#Create a new column for grouping by combining year, month, anc city
tdf$city_year_month = paste(as.character(strftime(tdf$tdate, format = "%Y" )),
as.character(strftime(tdf$tdate, format = "%m" )), tdf$tcity, sep = "_")
#Sort by the newly created column
tdf <- tdf[with(tdf, order(city_year_month)), ]
#Split by the grouping in new column and calculate differences
tdf$ntval1 = unlist(sapply(split(tdf, f = tdf$city_year_month),
function(x) c(min(x$tval1),diff(x$tval1, lag = 1, differences = 1))))