2017-03-16 4 views
0

私はそうのように見えます(整頓)データフレームを持っている:データフレームの行間でフィルタ処理された算術演算を実行するにはどうすればよいですか?

!> my_table 
# A tibble: 8 × 4 
      g  a  b  val 
     <date> <lgl> <lgl> <int> 
1 2015-01-01 FALSE FALSE 3175030 
2 2015-01-01 FALSE TRUE 72229 
3 2015-01-01 TRUE FALSE 125505 
4 2015-01-01 TRUE TRUE 856737 
5 2015-02-01 FALSE FALSE 3413510 
6 2015-02-01 FALSE TRUE 69203 
7 2015-02-01 TRUE FALSE 122925 
8 2015-02-01 TRUE TRUE 876366 

今私は、グループ・バイgしたいと列ab上のフィルタに基づいて行間の算術を行うと思います。 例えば、私は(グループごと)(TRUE,FALSE)行と(FALSE,TRUE)行の違い取るしたいと思います:非/半tidyverse世界で

# A tibble: 2 × 2 
      g diff 
     <date> <int> 
1 2015-01-01 53276 
2 2015-02-01 53722 

を、私はフィルタのような何かをしたいです最初(TRUE,FALSE)行はそのようにように、それぞれのc列の間の差を取る、その後、(FALSE,TRUE)行上の他のフィルタのテーブルであることを参加について: ...

diff_table <- inner_join(
    filter(my_table, a, !b) %>% select(g, val1 = val), 
,filter(my_table, !a, b) %>% select(g, val2 = val) 
) %>% transmute(g, diff = val1 - val2) 

これはうまく動作しますが、洗練ようで、私は思うかもしれないこれはgroup_byを使って簡単に行えます。 I. gでグループ化し、次に行の間の特定の値に対して算術演算を実行します。 誰かがもっと「きちんとした」エレガントな解決策を知っていますか?

答えて

0

これは何か?

df %>% 
    group_by(g) %>% 
    filter(a + b == 1) %>% 
    arrange(a) %>% 
    summarise(diff=diff(val)) 

# A tibble: 2 × 2 
      g diff 
     <date> <int> 
1 2015-01-01 53276 
2 2015-02-01 53722 
+0

このインスタンスでは有効ですが、フィルタリング変数( 'a'と' b')はこのように論理/整数として扱われるとは限りません。可能なレベルのサブセットに基づいて行を修飾する要素として、第3のフィルタリング変数を想像してみてください。 – mmuurr

+1

いくつかの例を示しますか? – JasonWang

関連する問題