2016-03-31 3 views
0

у меня есть R DataFrame ф.р. со следующим содержанием:Использование различий() в R с NA и отрицательными числами

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 
    .    .    . 

Я хотел бы узнать разницу между каждой последовательной парой тока одного и того же последовательного N. Это код, который я wrote.But я получаю какие-то странные результаты

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

Я получаю следующее, как outuput для этого столбца довольно странно, я получаю это:

2 6 NA NA NA 2 6 NA NA NA 

Что я хотел бы иметь на самом деле:

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 
    .    .    . 

ли дифф правильную вещь, чтобы сделать это? если нет, то как это решить (особенно без использования петель)?

ответ

1

Это может сработать для вас. Вы можете передавать значения с na.locf из пакета zoo. Условие ifelse заполняет my.diff только если ток не равен NA.

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

Работает отлично. спасибо – user3841581

Смежные вопросы