2017-03-02 17 views
1

我有一个data.frame:移的可变向上在R数据帧相对于另一变量

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为每个ID得到up.Pur如下:

ID Pur up.Pur 
2 0 1 
2 1 2 
2 2 3 
2 3 NA 
3 1 2 
3 2 NA 
5 4 5 
5 5 NA 

希望你对此有所帮助。

+3

我认为这是一个重复的,但'AVE(DF $ PUR,DF $ ID,FUN =函数(X)C(NA,尾巴( x,-1)))'应该这样做。否则,分别在'dplyr'或'data.table'中有'lead()'和'shift()'函数。 – thelatemail

+0

谢谢@thelatemail!在分组变量方面找不到任何问题。不过,我可能错过了。如果你知道类似的问题,很乐意去除这个问题。 – AliCivil

回答

2

我们可以使用shiftdata.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 
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