首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何提取某些行

如何提取某些行
EN

Stack Overflow用户
提问于 2013-03-08 11:37:49
回答 3查看 1.3K关注 0票数 1

如您所见,我在下面有一个价格和日期列

代码语言:javascript
运行
复制
 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

然后我想要下面的输出

代码语言:javascript
运行
复制
  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,所以代码应该是这样的

代码语言:javascript
运行
复制
difference<-tapply(Price[,1],Day, ____________)

所以基本上价格,1将是我的价格天“data.....while”是我创建的变量,它可以让我将一天的数据分成5天的间隔……我在想,在空白部分我可以放入函数或另一个变量,它可以让我用第一天的价格减去第5天的价格,然后第10天和第5天的prices...etc.....you不必帮助我将我的日子分成intervals...just如何做“差异”section....thanks

EN

回答 3

Stack Overflow用户

发布于 2013-03-08 11:53:22

这里有一个选项,假设您的data.frame名为"SODF":

代码语言:javascript
运行
复制
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行:

代码语言:javascript
运行
复制
> 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))所做的那样。

代码语言:javascript
运行
复制
# 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在评论中指出(谢谢!),这是使用:

代码语言:javascript
运行
复制
SODF[c(1, seq(5, nrow(SODF), 5)), ]

作为您的输入data.frame,您可以考虑使用以下内容:

代码语言:javascript
运行
复制
rbind(SODF[1,], SODF[$Day %% 5 == 0,] )

这两种方法的不同之处在于,第一种方法只是根据行号进行子集,而第二种方法根据"Day“列中的值进行子集,提取其中"Day”是5的倍数的行。第二种方法可能很有用,例如,当数据集中有缺失的行时。

票数 5
EN

Stack Overflow用户

发布于 2013-03-08 11:59:48

Ananda's是一种很好的方法(总是忘记自己的内心)。这是另一种方法:

代码语言:javascript
运行
复制
dat2 <- dat[seq(0, nrow(dat), by=5), ]
data.frame(Difference=diff(c(dat[1,1], dat2[, 1])), Day=dat2[, 2])
票数 1
EN

Stack Overflow用户

发布于 2013-03-08 12:15:56

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

在给定矩阵m、列col_id和数字间隔interv的情况下,后续函数将每个interv行的m矩阵的col_id列中的当前值与先前的值(之前的5行,明显相同的列)相减。

结果存储在一个名为diff的新列中,并附加到m矩阵的末尾。

简而言之,这种方法与@Ananda Mahto使用的方法非常相似。

因此,这是一个函数:

代码语言:javascript
运行
复制
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]))
}

示例:

代码语言:javascript
运行
复制
# 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)

输出:

代码语言:javascript
运行
复制
     price day diff
[1,]    14   5   12
[2,]    29  10   15
[3,]    44  15   15
[4,]    59  20   15
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15286287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档