簡體   English   中英

在R中使用diff()忽略NA

[英]Using diff() in R ignoring NA

我有一個具有以下內容的R DataFrame df:

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的每對連續電流之間的差異。這是我編寫的代碼。但是我得到了一些奇怪的結果

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

我得到以下內容,因為該列的輸出結果很奇怪,我明白了:

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

diff是正確的做法嗎? 如果沒有,如何解決(特別是不使用循環)?

通過應用

aggregate(current ~ Serial.N ,df1, diff)

一個獲得

  Serial.N current.1 current.2 current.3
1        B         2        -6         5
2        C        -2         4         4

對應於

B:    16 - 14 =  2
      10 - 16 = -6
      15 - 10 =  5
C:     9 - 11 = -2
      13 -  9 =  4
      17 - 13 =  4

因此, diff()aggregate()的輸出對我來說似乎很有意義。 我可能還不清楚您為什么期望您所描述的輸出。


編輯

如果current Serial N C中的第三個條目是-13而不是13(OP中的數據矛盾),則結果為

aggregate(current ~ Serial.N ,df1, diff)
#   Serial.N current.1 current.2 current.3
# 1        B         2        -6         5
# 2        C        -2       -22        30

這似乎更接近所需的輸出。


編輯2

要將mydiff列添加到mydiff ,該列可獲取相同Serial N連續值之間的差,而忽略NA值,我們可以使用

df1$mydiff <- with(df1, ave(current, Serial.N, 
                   FUN = function(x) c(NA, diff(na.omit(x)))))

這將導致警告(“ ...不是替換長度的倍數”),但結果將接近預期的輸出:

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

mydiff列中的值正確,但是缺少NA值之一(在第4行中)。 這是因為我們不能忽略NA ,同時要保留它們。 至少不是沒有對data.frame的重大操縱。

希望這可以幫助。


數據

df1 <- structure(list(Serial.N = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 
        2L, 2L, 2L), .Label = c("B", "C"), class = "factor"), year = c(10L, 
        10L, 11L, 11L, 11L, 12L, 12L, 12L, 12L), current = c(14L, 16L, 
        10L, NA, 15L, 11L, 9L, -13L, 17L)), .Names = c("Serial.N", "year", 
        "current"), class = "data.frame", row.names = c(NA, -9L))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM