所以你可以看到我有以下的价格和列日
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天的间隔......但我想要的代码,可以让我减去与第一天的第五届....第10天与第5天...等于是代码应该是这个样子
difference<-tapply(Price[,1],Day, ____________)
因此,基本上价格[,1]将是我的价格数据.....而“日”是我创建的,可以让我独立我的天数据分为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
第一步是基本子集。 根据你的描述和预期的答案,你要第一排,然后每隔第五行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的倍数。这第二种方法可能是有用的,例如,当有数据集中缺少的行。
阿南达的是一个很好的方法(总是忘了我心中的)。 这里的另一种方法:
dat2 <- dat[seq(0, nrow(dat), by=5), ]
data.frame(Difference=diff(c(dat[1,1], dat2[, 1])), Day=dat2[, 2])
这里的解决方案,如果你有一个矩阵作为输入 。
随后的功能,给定一个矩阵m
,列col_id
和数字间隔interv
,减去每interv
行中的电流值col_id
所述的柱m
矩阵与以前的值(5行之前,相同的列,obiviously)。
结果存储在新的一列称为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