R查找价值变化的下一行

时间:2016-04-23 20:59:20

标签: r

假设我有一个这样的数据表(或框架):

Time    Value
1            10
2            10
3            10
4            15
5            15
6            20

我想附加标记Value的下一次更改的时间和值的列。它看起来像这样:

Time    Value    T_Next    V_Next
1            10         4              15
2            10         4              15 
3            10         4              15 
4            15         6              20
5            15         6              20
6            20         NA          NA

我对最后一行并不在意。我能想到的唯一方法是使用一些嵌套的for循环,这会很慢,而且我有一个大的数据集。我敢肯定有更多R风格的方式来做它会更高效。任何帮助赞赏!

3 个答案:

答案 0 :(得分:3)

这个怎么样?:

cbind(df, df[rep(cumsum(rle(df$Value)$lengths) + 1, rle(df$Value)$lengths),])
    Time Value Time Value
4      1    10    4    15
4.1    2    10    4    15
4.2    3    10    4    15
6      4    15    6    20
6.1    5    15    6    20
NA     6    20   NA    NA

答案 1 :(得分:1)

我在寻找如何在data.table中查找第一行时遇到了这个老问题,其中值与上一行相比有所变化。由于其他data.table答案所建议的结果与问题所要求的结果不同,因此这是另一个data.table选项:

# create a sample data table
dt = data.table('Time' = c(1,2,3,4,5,6), 'Value' = c(10,10,10,15,15,20))

# Add new columns storing Value and Time if Value is different from preceding row Value
dt[
  Value != shift(Value, 1),
  `:=`(shifted_time = Time, shifted_value = Value)]


# back-fill missing values with next (non-na) observation caried backward    
dt[, `:=`(
  shifted_time = nafill(shifted_time, 'nocb'),
  shifted_value = nafill(shifted_value, 'nocb'))]

# make sure that shifted_value is not equal value    
dt[Value != shift(Value, 1),
     `:=`(
       shifted_time = shift(Time, -1),
       shifted_value = shift(Value, -1))]

这将导致:

dt
   Time Value shifted_time shifted_value
1:    1    10            4            15
2:    2    10            4            15
3:    3    10            4            15
4:    4    15            6            20
5:    5    15            6            20
6:    6    20           NA            NA

答案 2 :(得分:0)

以下是data.table的另一个选项。转换' data.frame'根据&{39;值' lag的{​​{1}}分组到' data.table',我们找到&{39}的rleid。时间'和'价值'创建两列' T_next'和' V_next'。然后,将最后一行更改为NA。

max