如何提取某些行

时间:2013-03-08 03:37:49

标签: 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

然后我想要输出

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

3 个答案:

答案 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