簡體   English   中英

R dplyr / tidyr:使用其他觀測值的數據“突變”新列

[英]R dplyr/tidyr: “mutate” new columns with data from other observations

我正在嘗試使用dplyr / tidyr函數通過使用來自先前但相關行的數據來創建兩個新變量。 在我的示例中,我有一個data.frame,其中包含ID,YEAR和AMOUNT的數據(請參見下文)。

    ID   YEAR    AMOUNT
    A    2000    4
    B    2000    4
    A    2001    2
    B    2001    3
    A    2002    3
    B    2002    1

我想使用dplyr / tidyr動態創建最后兩列(請參見下文)(我找到了一種定期執行此方法的方法,但我想知道如何在dplyr / tidyr的最新版本中進行操作)。

    ID   YEAR    AMOUNT    YtY_VARIANCE    Y_VARIANCE
    A    2000    4         0               0
    B    2000    4         0               0
    A    2001    2         -2              -2
    B    2001    3         -1              -1
    A    2002    3         +1              -1
    B    2002    1         -2              -3

其中YtY_VARIANCE是通過從上一年中減去金額而獲得的,而Y_VARIANCE是通過從第一年中減去金額而得出的(始終)。

我希望這樣的代碼:

    raw_data %>%
        group_by(ID, YEAR) # Not even sure if that's required?!?
        mutate(YtY_VARIANCE = xxx(), Y_VARIANCE = yyy() )

xxx和yyy應該是什么? 那有可能嗎?

任何人都可以告訴或指出我的答案嗎?

提前致謝!

你可以試試

 raw_data %>% 
      group_by(ID) %>% 
      mutate(YtY_VARIANCE=AMOUNT-lag(AMOUNT),
       YtY_VARIANCE=replace(YtY_VARIANCE, which(is.na(YtY_VARIANCE)), 0), 
      Y_VARIANCE=AMOUNT-AMOUNT[1L])
 #      ID YEAR AMOUNT YtY_VARIANCE Y_VARIANCE
 #1  A 2000      4            0          0
 #2  B 2000      4            0          0
 #3  A 2001      2           -2         -2
 #4  B 2001      3           -1         -1
 #5  A 2002      3            1         -1
 #6  B 2002      1           -2         -3

感謝Matthew和Akrun! 有了您的兩個解決方案,我就能找到最終的解決方案。

Akrun建議的解決方案在我的簡單模型中有效,但在我的更大/復雜/最終模型中仍然存在問題。 我最終得到的最終解決方案是將兩者結合起來:

    raw_data %>% 
      group_by(ID) %>%
      arrange(YEAR) %>%
      mutate(YtY_VARIANCE=AMOUNT-lag(AMOUNT),
             YtY_VARIANCE=replace(YtY_VARIANCE, which(is.na(YtY_VARIANCE)), 0), 
             Y_VARIANCE=AMOUNT-first(AMOUNT))

謝謝你的幫助! 希望它將對其他人有所幫助!

暫無
暫無

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

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