所以你可以看到我有一个价格和日期列在下面
Price Day
2 1
5 2
8 3
11 4
14 5
17 6
20 7
23 8
26 9
29 10
32 11
35 12
38 13
41 14
44 15
47 16
50 17
53 18
56 19
59 20
Run Code Online (Sandbox Code Playgroud)
然后我想要下面的输出
Difference Day
12 5
15 10
15 15
15 20
Run Code Online (Sandbox Code Playgroud)
所以现在我每5天就有不同的价格...它基本上是第一天减去第5天.....然后是第5天等第10天......我已经制作了一个代码将我的数据分成5天的时间间隔......但我希望代码能让我减去第5天的第5天......第5天的第10天......等等所以代码应该看起来像这样
difference<-tapply(Price[,1],Day, ____________)
Run Code Online (Sandbox Code Playgroud)
所以基本上Price [,1]将是我的价格数据.....而"Day"是我创建的变量,它将让我将我的Day数据分成5天的间隔.....我在想空白部分我可以放入功能或另一个变量,让我减去第5天的第1天价格,然后第10天和第5天的价格...等.....你没有必要帮助我将我的日子分成几个间隔...如何做"差异"部分....谢谢你们
这是一个选项,假设您data.frame被称为"SODF":
within(SODF[c(1, seq(5, nrow(SODF), 5)), ], {
Price <- diff(c(0, Price))
})[-1, ]
# Price Day
# 5 12 5
# 10 15 10
# 15 15 15
# 20 15 20
Run Code Online (Sandbox Code Playgroud)
第一步是基本子集.根据您的描述和预期答案,您需要第一行,然后从第5行开始每隔五行:
> SODF[c(1, seq(5, nrow(SODF), 5)), ]
Price Day
1 2 1
5 14 5
10 29 10
15 44 15
20 59 20
Run Code Online (Sandbox Code Playgroud)
从那里,您可以diff在"价格"列上使用,但由于diff将导致长度比您的输入短一个的向量,您需要"填充"输入向量,我做了diff(c(0, Price)).
# Correct values, but the number of rows needs to be 5
> diff(SODF[c(1, seq(5, nrow(SODF), 5)), "Price"])
[1] 12 15 15 15
Run Code Online (Sandbox Code Playgroud)
然后,[-1, ]最后只删除无关的行.
在下面的评论中,@ geektrader在评论中指出(谢谢!),使用的替代方法:
SODF[c(1, seq(5, nrow(SODF), 5)), ]
Run Code Online (Sandbox Code Playgroud)
作为您的输入data.frame,您可以考虑使用以下代码:
rbind(SODF[1,], SODF[$Day %% 5 == 0,] )
Run Code Online (Sandbox Code Playgroud)
两种方法的不同之处在于第一种方法只是按行号进行子集,而第二种方法根据"日"列中的值进行子集,提取"日"是5的倍数的行.第二种方法可能是例如,当数据集中缺少行时,这是有用的.