从R中的上一行获取值

从R中的上一行获取值,r,R,假设我有一个df as 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) 我想将ID中的c值移动到新列的下一行 所以结果应该是这样的 a b c new 1 A1 1 100 NA

假设我有一个df as

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)
我想将ID中的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

我们可以使用
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
库(tidyverse)
df1%>%
分组依据(ID)%>%
突变(新=滞后(c))
#ID b c新
#      
#1 A1 1100 NA
#2 A1 2 200 100
#3 A1 3 300 200
#4 A2 1400 NA
#5 A2 2500 400
#6 A3 1600 NA
#7 A3 2 700 600
#8 A3 380700

基本上,这只是
dplyr
而已,不是吗?@ztl是的,但tidyverse包含更多的软件包,因此,如果需要,我们可以使用其他功能OK。这让我不太容易理解,我想知道我使用的函数的确切来源,但好吧。。。(顺便说一句,我一直认为R代码应该包括包源代码,如
dplyr::mutate
等,这是Python中的一个惯例,但这是另一个故事…)不,我不会解释的。也许是因为这个问题已经以重复的形式结束了——事实上,在不先检查是否是重复的情况下快速回答问题确实可以作为否决票的理由,因为这会“污染”所以,但否决票不是我的。。。
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