所以你可以看到我的价格和日期列在下面
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
然后我想要输出
Difference Day
12 5
15 10
15 15
15 20
所以现在我每5天就有不同的价格...它基本上是第一天减去第5天.....然后是第5天的第10天...... 我已经制作了一个代码,将我的数据分成5天...但我希望代码能让我减去第5天的第5天......第5天的第10天......等等 所以代码应该看起来像这样
difference<-tapply(Price[,1],Day, ____________)
所以基本上Price [,1]将是我的价格数据.....而“Day”是我创建的变量,它会让我将我的Day数据分成5天的间隔.....我是认为在空白部分我可以放入功能或另一个变量,让我减去第5天的第1天价格,然后第10天和第5天的价格......等等.....你没有必要帮助我将我的日子分成几个间隔...如何做“差异”部分....谢谢你们
答案 0 :(得分: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
第一步是基本子集。根据您的描述和预期答案,您需要第一行,然后从第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
从那里,您可以在“价格”列上使用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
然后,最后的[-1, ]
只删除了无关的行。
在下面的评论中,@ geektrader在评论中指出(谢谢!),使用的替代方法:
SODF[c(1, seq(5, nrow(SODF), 5)), ]
作为输入data.frame
,您可以考虑使用以下代码:
rbind(SODF[1,], SODF[$Day %% 5 == 0,] )
两种方法的不同之处在于第一种方法只是通过行号进行子集,而第二种方法根据“日期”列中的值进行子集,提取“日”是5的倍数的行。第二种方法可能很有用,例如,当数据集中缺少行时。
答案 1 :(得分:1)
阿南达是一个很好的方法(总是忘记自己)。这是另一种方法:
dat2 <- dat[seq(0, nrow(dat), by=5), ]
data.frame(Difference=diff(c(dat[1,1], dat2[, 1])), Day=dat2[, 2])
答案 2 :(得分:0)
如果你有一个矩阵作为输入,这里有一个解决方案。
给定矩阵m
,列col_id
和数字间隔interv
的后续函数会减去interv
中每个col_id
行的当前值带有前一个值的m
矩阵的列(前面5行,相同的列,显而易见)。
结果存储在名为diff
的新列中,并附加到m
矩阵的末尾。
简而言之,这种方法与@Ananda Mahto使用的方法非常相似。
所以,这是函数:
subtract_column <- function(m, col_id, interv) {
select <- c(1, seq(interv, nrow(m), interv))
cbind(m[select[-1], ], diff = diff(m[select, col_id]))
}
示例:
# this emulates your data as a matrix
price_vect <- c(2,5,8,11,14,17,20,23,26,29,32,35,38,41,44,47,50,53,56,59)
day_vect <- 1:20
matr <- do.call(cbind, list(price = price_vect, day = day_vect))
# and this calls the function above and does the job:
# subtracts every 5 rows the current and the previous (5 rows back) value in the column `price` of matrix `matr`
subtract_column(matr, 'price', 5)
输出:
price day diff
[1,] 14 5 12
[2,] 29 10 15
[3,] 44 15 15
[4,] 59 20 15