2017-02-22 14 views
0

позволяет сказать, что у меня есть ФР, какПолучить значение из предыдущей строки в R

ID <- c("A1","A1","A1", "A2","A2","A3", "A3", "A3") 
b <- c(1,2 , 3, 1, 2, 1, 2, 3) 
c <- c (100, 200, 300 ,400, 500 ,600 ,700, 800) 
df1 <- data.frame(ID,b,c) 

SO ФР выглядит, что

 a b c 
    1 A1 1 100 
    2 A1 2 200 
    3 A1 3 300 
    4 A2 1 400 
    5 A2 2 500 
    6 A3 1 600 
    7 A3 2 700 
    8 A3 3 800 

Я хочу, чтобы переместить значение с, в пределах ID , к следующей строке в новом столбце

поэтому результат должен быть как

 a b c new 
    1 A1 1 100 NA 
    2 A1 2 200 100 
    3 A1 3 300 200 
    4 A2 1 400 NA 
    5 A2 2 500 400 
    6 A3 1 600 NA 
    7 A3 2 700 600 
    8 A3 3 800 700 

ответ

1

Мы можем использовать tidyverse

library(tidyverse) 
df1 %>% 
    group_by(ID) %>% 
    mutate(new = lag(c)) 
#  ID  b  c new 
# <fctr> <dbl> <dbl> <dbl> 
#1  A1  1 100 NA 
#2  A1  2 200 100 
#3  A1  3 300 200 
#4  A2  1 400 NA 
#5  A2  2 500 400 
#6  A3  1 600 NA 
#7  A3  2 700 600 
#8  A3  3 800 700 
+3

в основном, это 'dplyr' только, нет? – ztl

+0

@ztl Да, но tidyverse включает в себя больше пакетов, поэтому при необходимости мы можем использовать другие функции – akrun

+1

OK. Это делает его менее читаемым для меня, мне нравится точно знать, какие функции я использую, но ОК ... (Кстати, я всегда считаю, что R-код должен включать источник пакета, например 'dplyr :: mutate' и т. Д., Так как это например, соглашение на Python, но это еще одна история ...) – ztl