2016-03-31 13 views
0

I einen R Datenrahmen haben df mit folgendem Inhalt:Verwenden von diff() in R mit NA und negativen Zahlen

Serial N   year   current 
    B    10   14 
    B    10   16 
    B    11   10 
    B    11   NA 
    B    11   15 
    C    12   11 
    C    12    9 
    C    12   13 
    C    12   17 
    .    .    . 

Ich mag die Differenz zwischen dem jedem aufeinanderfolgenden Paar von Strom von den gleichen Serien finden Dieser N. ist Code, den ich wrote.But ich einige seltsame Ergebnisse

library(data.table) 
setDT(df)[,mydiff:=diff(df$current),by=Serial N] 
print(length(df$current)) 

ich für diese Spalte erhalten die folgenden als outuput bin immer ist ziemlich seltsam, ich diese:

2 6 NA NA NA 2 6 NA NA NA 

Was würde ich eigentlich haben möchte ist:

Serial N   year   current  mydiff 
    B    10   14   
    B    10   16   16-14=2 
    B    11   10   10-16=-4 
    B    11   NA   NA 
    B    11   15   15-10=5 
    C    12   11 
    C    12    9   9-11=-2  
    C    12   -13  -13-9=-22 
    C    12   17   17-(-13)=30 
    .    .    . 

das Richtige ist diff, das zu tun? wenn nicht, wie kann man das angehen (vor allem ohne Schleifen)?

Antwort

1

Dies kann für Sie arbeiten. Sie können Werte mit na.locf aus dem Zoo-Paket holen. Die Bedingung ifselse füllt my.diff nur aus, wenn der aktuelle Wert nicht NA ist.

library(data.table) 
library(zoo) 
df <- read.table(textConnection(" 
         'Serial N'   year   current 
          B    10   14 
          B    10   16 
          B    11   10 
          B    11   NA 
          B    11   15 
          C    12   11 
          C    12    9 
          C    12   -13 
          C    12   17"),header=TRUE) 

setDT(df) 
setkey(df,Serial.N) 
df[,my.diff := ifelse(!is.na(current), c(" ",diff(na.locf(current))), NA),by=Serial.N] 


#  Serial.N year current my.diff 
# 1:  B 10  14   
# 2:  B 10  16  2 
# 3:  B 11  10  -6 
# 4:  B 11  NA  NA 
# 5:  B 11  15  5 
# 6:  C 12  11   
# 7:  C 12  9  -2 
# 8:  C 12  -13  -22 
# 9:  C 12  17  30 
+0

Es funktioniert perfekt. Vielen Dank – user3841581