2017-03-16 13 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)行之間的差:

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

在非/半tidyverse世界,我會執行類似濾波器先上(TRUE,FALSE)行再加入與在(FALSE,TRUE)行另一個過濾表,然後採取c列之間的差異爲每個,像這樣:

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來完成這個更簡單的方法。 也就是說然後按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')可能並不總是如此輕易地被視爲邏輯/整數。想象一下,第三個過濾變量是基於可能級別的子集來限定行的因素...... – mmuurr

+1

您想提供一些示例嗎? – JasonWang

相關問題