相对于另一个变量在R数据框中向上移动变量

时间:2017-03-02 00:49:08

标签: r

我有一个data.frame:

ID <-c(2,2,2,2,3,3,5,5)
Pur<-c(0,1,2,3,1,2,4,5)
df<-data.frame(ID,Pur)

我想推送每个Pur的{​​{1}}以获取ID,如下所示:

up.Pur

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

这是dplyr方法

library(dplyr)

ID <-c(2,2,2,2,3,3,5,5)
Pur<-c(0,1,2,3,1,2,4,5)
df<-data.frame(ID,Pur)

df %>% 
  group_by(ID) %>%
  mutate(up.Pur = lead(Pur)) 

# Source: local data frame [8 x 3]
# Groups: ID [3]
# 
#       ID   Pur   up.Pur
# <dbl> <dbl>  <dbl>
# 1     2     0      1
# 2     2     1      2
# 3     2     2      3
# 4     2     3     NA
# 5     3     1      2
# 6     3     2     NA
# 7     5     4      5
# 8     5     5     NA

为了完整起见,我已添加了基本R方法,以防您不想安装任何软件包。

dfList = split(df, ID)

dfList = lapply(dfList, function(x){
  x$up.Pur = c(x$Pur[-1], NA)
  return(x)
})

unsplit(dfList, ID)

#   ID Pur up.Pur
# 1  2   0      1
# 2  2   1      2
# 3  2   2      3
# 4  2   3     NA
# 5  3   1      2
# 6  3   2     NA
# 7  5   4      5
# 8  5   5     NA

答案 1 :(得分:2)

我们可以使用shift

中的data.table
library(data.table)
setDT(df)[, up.Pur := shift(Pur, type = "lead"), by = ID]
df
#   ID Pur up.Pur
#1:  2   0      1
#2:  2   1      2
#3:  2   2      3
#4:  2   3     NA
#5:  3   1      2
#6:  3   2     NA
#7:  5   4      5
#8:  5   5     NA