根据特定的时间序列天数和另一列进行选择

时间:2017-01-30 19:19:20

标签: r

我有一个可以这样表示的数据框:

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循环有没有办法做到这一点?

在逻辑上,我处于一个巨大的损失,如何处理时间序列。任何帮助和建议表示赞赏。谢谢!

1 个答案:

答案 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))))