2016-04-23 4 views
1

Скажем, у меня есть таблица данных (или кадр), как это:R Найти следующий ряд Где Value Изменения

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

я хотел присоединять колонки, отмечающие время и значение следующего изменения стоимости , Это будет выглядеть так:

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 

Мне все равно, о последнем ряду. Единственный способ, которым я могу думать, это сделать с некоторыми вложенными циклами, которые будут медленными, и у меня есть большой набор данных. Я уверен, что есть еще один способ R-стиля, который будет более впечатляющим. Любая помощь ценится!

ответ

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 
+0

Это хороший там. –

+0

@DavidArenburg Спасибо :-) – DatamineR

0

Вот еще один вариант с data.table. Преобразуйте «data.frame» в «data.table», сгруппированный по lag из rleid «Значение», мы находим max «Время» и «Значение» для создания двух столбцов «T_next» и «V_next». Затем измените последнюю строку на NA.

library(data.table) 
setDT(df1)[, paste(c("T", "V"), "next", sep="_") := lapply(.SD, max), 
    by = .(shift(rleid(Value), fill = 1))][.N, c("T_next", "V_next") := rep(list(NA),2)][] 
# Time Value T_next V_next 
#1: 1 10  4  4 
#2: 2 10  4  4 
#3: 3 10  4  4 
#4: 4 15  4  4 
#5: 5 15  6  6 
#6: 6 20  NA  NA 
Смежные вопросы