如您所见,我在下面有一个价格和日期列
 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天days...it的差价,基本上减去第5天与第一个day.....and,然后第10天与第5天,等等…我已经做了一个代码,将我的数据分成5天的intervals...but,我想要的代码将让我减去第5天与第1个day....the第10天与第5个day...etc,所以代码应该是这样的
difference<-tapply(Price[,1],Day, ____________)所以基本上价格,1将是我的价格天“data.....while”是我创建的变量,它可以让我将一天的数据分成5天的间隔……我在想,在空白部分我可以放入函数或另一个变量,它可以让我用第一天的价格减去第5天的价格,然后第10天和第5天的prices...etc.....you不必帮助我将我的日子分成intervals...just如何做“差异”section....thanks
发布于 2013-03-08 11:53:22
这里有一个选项,假设您的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行开始每隔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,] )这两种方法的不同之处在于,第一种方法只是根据行号进行子集,而第二种方法根据"Day“列中的值进行子集,提取其中"Day”是5的倍数的行。第二种方法可能很有用,例如,当数据集中有缺失的行时。
发布于 2013-03-08 11:59:48
Ananda's是一种很好的方法(总是忘记自己的内心)。这是另一种方法:
dat2 <- dat[seq(0, nrow(dat), by=5), ]
data.frame(Difference=diff(c(dat[1,1], dat2[, 1])), Day=dat2[, 2])发布于 2013-03-08 12:15:56
如果你有一个矩阵作为输入,这里是一个解决方案。
在给定矩阵m、列col_id和数字间隔interv的情况下,后续函数将每个interv行的m矩阵的col_id列中的当前值与先前的值(之前的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   15https://stackoverflow.com/questions/15286287
复制相似问题