2017-02-22 60 views
0

可以說我有一個DF作爲獲取上一行中的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) 

所以DF看起來像

 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 

我想移動c的值,中號,在新列

下一行,所以結果應該是像

 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