假设我有一个这样的数据表(或框架):
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风格的方式来做它会更高效。任何帮助赞赏!
答案 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