如何提取某些行

1 r extract subtraction

所以你可以看到我有一个价格和日期列在下面

 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天的价格...等.....你没有必要帮助我将我的日子分成几个间隔...如何做"差异"部分....谢谢你们

A5C*_*2T1 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的倍数的行.第二种方法可能是例如,当数据集中缺少行时,这是有用的.