0

以前の関連する行のデータを使用して、dplyr/tidyr 関数を使用して 2 つの新しい変数を作成しようとしています。私の例では、ID、YEAR、および AMOUNT のデータを含む data.frame があります (以下を参照)。

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

dplyr/tidyr を使用して最後の 2 つの列を動的に作成したい (以下を参照) (定期的に行う方法を見つけましたが、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 は何でしょう?! それは可能ですか?

誰でも答えを教えたり、指摘したりできますか?

前もって感謝します!

4

2 に答える 2

2

あなたは試すことができます

 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
于 2015-03-19T19:00:30.580 に答える
-2

マシューとアクランに感謝します!両方の解決策で、最終的な解決策を見つけることができました。

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

ご協力いただきありがとうございます!そしてうまくいけば、それは他の人を助けるでしょう!

于 2015-03-20T23:05:42.343 に答える