如何提取某些行(How to extract certain rows)

2019-10-17 19:05发布

所以你可以看到我有以下的价格和列日

 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日的价格...等等.....你没有帮我单独我天进间隔......只是如何做到“差异化”部分....感谢球员

Answer 1:

这里有一个选项,假设你的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的倍数。这第二种方法可能是有用的,例如,当有数据集中缺少的行。



Answer 2:

阿南达的是一个很好的方法(总是忘了我心中的)。 这里的另一种方法:

dat2 <- dat[seq(0, nrow(dat), by=5), ]
data.frame(Difference=diff(c(dat[1,1], dat2[, 1])), Day=dat2[, 2])


Answer 3:

这里的解决方案,如果你有一个矩阵作为输入

随后的功能,给定一个矩阵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


文章来源: How to extract certain rows