2016-08-02 12 views
1

を作成して私のデータは、このようになりますし、すでにソートされていますは、同じIDと前の値を含む新しい列

> dput(df) 
structure(list(id = c(1, 2, 3, 3, 2, 2, 1), x = c(20, 40, 70, 
70, 80, 40, 70)), .Names = c("id", "x"), row.names = c(NA, -7L 
), class = "data.frame") 

> df 
    id x 
1 1 20 
2 2 40 
3 3 70 
4 3 70 
5 2 80 
6 2 40 
7 1 70 

私は同じidxの前の値を含む新しい列を作成する必要があります。

for (i in 1:nrow(df)){ 
    id0 = df$id[i] 
    j = i + match(id0 , df$id[i+1:nrow(df)]) 
    df$old_x[i] = df$x[j] 
} 

が、それはあまりにも遅いです:私はこのようにそれを行うことができます

> df 
    id x old_x 
1 1 20 70 
2 2 40 80 
3 3 70 70 
4 3 70 NA 
5 2 80 40 
6 2 40 NA 
7 1 70 NA 

:だから、結果がでなければなりません。それをする最善の方法は何でしょうか?

ありがとうございました! dplyrを使用

+0

以前の値または次の値ですか?あなたの出力は次の値です。以前の値であれば、 'lead'の代わりに' lag'を使います。 – Sumedh

+0

私のデータは実際に降順でソートされているので、私は 'previous'を意味しました。 – Scarabee

答えて

3

df$old_x <- ave(df$x, df$id, FUN=function(i) c(tail(i, -1), NA)) 

df 
    id x old_x 
1 1 20 70 
2 2 40 80 
3 3 70 70 
4 3 70 NA 
5 2 80 40 
6 2 40 NA 
7 1 70 NA 
+0

ありがとう、それは私のデータセットで最も速いメソッドです。 – Scarabee

1

avetailと基地R法です。 'data.frame'を 'id'でグループ化した 'data.table'(setDT(df))に変換すると、 'x'の値leadが 'old_x'に割り当てられます(:=)。これは、我々が適切に割り当てているので、非常に速くなければならない。

library(data.table) 
setDT(df)[,old_x := shift(x, type = "lead") , by = id] 
df 
# id x old_x 
#1: 1 20 70 
#2: 2 40 80 
#3: 3 70 70 
#4: 3 70 NA 
#5: 2 80 40 
#6: 2 40 NA 
#7: 1 70 NA 
2

我々はdata.tableを使用することができ:ここ

library(dplyr) 
df %>% group_by(id) %>% mutate(old_x = lead(x)) 

#Source: local data frame [7 x 3] 
#Groups: id [3] 

#  id  x old_x 
# <dbl> <dbl> <dbl> 
#1  1 20 70 
#2  2 40 80 
#3  3 70 70 
#4  3 70 NA 
#5  2 80 40 
#6  2 40 NA 
#7  1 70 NA