【问题标题】:Complex time-based subsetting in RR中基于时间的复杂子集
【发布时间】:2013-10-20 09:06:01
【问题描述】:

我有很多时间数据 (YYYY/MM/DD HH:MM:SS.SSS) 以不规则的数千秒间隔存储。在每个时间段有十个空间测量值(X、Y 和 Z 值)。

我想要获取数据的一个子集,例如每半秒(或几分之一秒)进行的第一组十个空间测量。

我对 R 还很陌生,因此我们将不胜感激!

以下是 2 次测量时间的示例:

2012/09/21 14:59:07:712,A,0.036,0.224,0.814
2012/09/21 14:59:07:712,B,0.042,0.057,0.934
2012/09/21 14:59:07:712,C,-0.104,0.008,0.930
2012/09/21 14:59:07:712,D,0.158,0.001,0.914
2012/09/21 14:59:07:712,E,-0.208,-0.168,0.778
2012/09/21 14:59:07:712,F,-0.185,0.087,0.748
2012/09/21 14:59:07:712,G,-0.176,0.155,0.738
2012/09/21 14:59:07:712,H,0.236,-0.171,0.790
2012/09/21 14:59:07:712,I,0.244,0.076,0.732
2012/09/21 14:59:07:712,J,0.248,0.137, 0.722
2012/09/21 14:59:07:848,A,0.036,0.224,0.814
2012/09/21 14:59:07:848,B,0.042,0.057,0.934
2012/09/21 14:59:07:848,C,-0.104,0.008,0.930
2012/09/21 14:59:07:848,D,0.158,0.001,0.914
2012/09/21 14:59:07:848,E,-0.208,-0.168,0.778
2012/09/21 14:59:07:848,F,-0.185,0.087,0.748
2012/09/21 14:59:07:848,G,-0.176,0.155,0.738
2012/09/21 14:59:07:848,H,0.236,-0.171,0.790
2012/09/21 14:59:07:848,I,0.244,0.076,0.732
2012/09/21 14:59:07:848,J,0.248,0.137, 0.722

【问题讨论】:

  • 欢迎来到 Stack Overflow!请提供更好的样本数据或可重现的示例,以便这里的好人可以更好地帮助您。请参阅stackoverflow.com/questions/5963269/… 还包括您到目前为止尝试过的内容。这里不是让您免费完成工作的地方。

标签: r


【解决方案1】:

不清楚你想做什么。您可以从读取数据开始。由于它是不规则的时间序列,并且包含一个因子变量(第一组),因此您不能使用像zooxts 这样的方便包,因为它们需要一个矩阵作为结构。但是你可以使用来自data.table 包的fread

library(data.table)
dat <- fread('2012/09/21 14:59:07:712,A,0.036,0.224,0.814
2012/09/21 14:59:07:712,B,0.042,0.057,0.934
2012/09/21 14:59:07:712,C,-0.104,0.008,0.930
2012/09/21 14:59:07:712,D,0.158,0.001,0.914
2012/09/21 14:59:07:712,E,-0.208,-0.168,0.778
2012/09/21 14:59:07:712,F,-0.185,0.087,0.748
2012/09/21 14:59:07:712,G,-0.176,0.155,0.738
2012/09/21 14:59:07:712,H,0.236,-0.171,0.790
2012/09/21 14:59:07:712,I,0.244,0.076,0.732
2012/09/21 14:59:07:712,J,0.248,0.137, 0.722
2012/09/21 14:59:07:848,A,0.036,0.224,0.814
2012/09/21 14:59:07:848,B,0.042,0.057,0.934
2012/09/21 14:59:07:848,C,-0.104,0.008,0.930
2012/09/21 14:59:07:848,D,0.158,0.001,0.914
2012/09/21 14:59:07:848,E,-0.208,-0.168,0.778
2012/09/21 14:59:07:848,F,-0.185,0.087,0.748
2012/09/21 14:59:07:848,G,-0.176,0.155,0.738
2012/09/21 14:59:07:848,H,0.236,-0.171,0.790
2012/09/21 14:59:07:848,I,0.244,0.076,0.732
2012/09/21 14:59:07:848,J,0.248,0.137, 0.722',header=FALSE)

现在您可以使用您的结构。例如,要获得前 5 个组,您可以这样做:

 dat[V2 %in% LETTERS[1:5],]
                         V1 V2     V3     V4    V5
 1: 2012/09/21 14:59:07:712  A  0.036  0.224 0.814
 2: 2012/09/21 14:59:07:712  B  0.042  0.057 0.934
 3: 2012/09/21 14:59:07:712  C -0.104  0.008 0.930
 4: 2012/09/21 14:59:07:712  D  0.158  0.001 0.914
 5: 2012/09/21 14:59:07:712  E -0.208 -0.168 0.778
 6: 2012/09/21 14:59:07:848  A  0.036  0.224 0.814
 7: 2012/09/21 14:59:07:848  B  0.042  0.057 0.934
 8: 2012/09/21 14:59:07:848  C -0.104  0.008 0.930
 9: 2012/09/21 14:59:07:848  D  0.158  0.001 0.914
10: 2012/09/21 14:59:07:848  E -0.208 -0.168 0.778

【讨论】:

  • 你好。让我试着更好地解释我想要做什么。所以我可以毫无问题地将数据加载到 R 中(我正在使用 Deducer)。我还可以将第一列从字符转换为时间。我遇到的麻烦是弄清楚如何根据时间选择数据的子集。例如,假设我想每十分之一秒制作每组十个样本的第一个实例的子集(即 A-J,10 行都同时测量)。这更有意义吗?
  • 我猜我需要使用某种类型的循环结构。或者也许是 Wickham 的 plyr 包。我知道子集函数允许您根据连续的特定值创建子集,但我不知道如何调整条件语句以便它可以选择移动时间窗口内的第一次出现(例如,第一次出现在半秒内'bin)。
【解决方案2】:

这是我想出的能够解决问题的解决方案(唯一的弱点是它无法以 1 秒的间隔创建移动平均线):

data_ID_P001

【讨论】:

    猜你喜欢
    • 2020-02-25
    • 2012-03-25
    • 2017-02-14
    • 2017-09-18
    • 2018-04-23
    • 1970-01-01
    • 2018-06-23
    • 2014-10-30
    • 2020-12-14
    相关资源
    最近更新 更多