2017-07-24 90 views
0

嘗試根據以前的分組進行條件彙總。遇到麻煩了。有條件地在dplyr中進行彙總/變異

我想根據哪些是在類型r1,由f分組後總結amt列。

重複性代碼:

s <- sample(c('one', 'two'), 96, replace = TRUE) 
f <- sample(c('a','s','d','f'), 96, replace = TRUE) 
r1_amt <- runif(96, 1, 100) 
r2_amt <- runif(96, 1, 100) 
r3_amt <- runif(96, 1, 100) 
x <- data_frame(s, f, r1_amt, r2_amt, r3_amt) 


smy <- x %>% 
    group_by(f) %>% 
    summarise(n = n(), # population in each f group 
      num_r1 = sum(r1_amt >= 50)) # amount of r1 in each f group 

我試過.[r1_amt >= 50]$amtcumsum(r1_amt >= 50)sum(ifelse(r1_amt >= 50, r1_amt, 0))但一直沒能拿出的分組編號。

因此,1給定的行可以是r1的60,r2的40,r3的55,並且如果有意義的話,它應該被包括在僅用於r1和r3的總計數量列中。

+0

什麼是你期望的輸出? – Psidom

+0

我調整了可重現的例子,因爲我沒有把它做得相當正確。如果在r1_amt中有超過50個,我想將給定的觀察分類爲r1。然後sum_r1_amt列應該是r1_amt的總和,只有當觀察值大於50時。 –

+1

@MattW。如果你想改變你的問題,請問另一個作爲跟進。 16小時後回來並編輯您的問題並不專業。修改我的答案以解決您的新問題並不困難,但我會將其留給您,或者其他答案。 – Masoud

回答

1

這太有點清潔的方式是可行的,但這應該工作:

x.v2 <- x # temp variable 
x.v2[which(x[,4] != 'r1'),3] <- 0 # replace values of tpe != 'r1' with 0's 

smy <- x.v2 %>% 
      group_by(f) %>% 
      summarise(n = n(), # population in each f group 
      num_r1 = sum(amt)) # sum of values for type == 'r1' in each group f 

rm(x.v2) # remove temp variable 

smy # output for seed = 123 (use set.seed(123) for building data) 


# f n num_r1 
# 1 a 20 114.1879 
# 2 d 28 611.9858 
# 3 f 19 351.5366 
# 4 s 29 357.8402 
1

這聽起來像你想做的事就是由兩個F組和類型來計算每-F /類型統計。

x %>% group_by(f, type) %>% summarise(num_type=n(), sum_type=sum(amt)) 
Source: local data frame [16 x 4] 
Groups: f [?] 

     f type num_type sum_type 
    <chr> <chr> <int>  <dbl> 
1  a r1  12 616.6610 
2  a r2  6 417.5589 
3  a r3  9 375.2246 
4  a r4  7 346.5796 
5  d r1  8 471.1253 
... 

您可以使用tidyr回去寬形式的sum_type領域,但我只會爲了顯示這樣做:

> res %>% spread(type, sum_amt) 
Source: local data frame [12 x 6] 
Groups: f [4] 

     f num_type  r1  r2  r3  r4 
* <chr> <int> <dbl> <dbl> <dbl> <dbl> 
1  a  6  NA 417.5589  NA  NA 
2  a  7  NA  NA  NA 346.5796 
3  a  9  NA  NA 375.2246  NA 
... 
+0

你絕對是對的。我意識到我沒有真正創建可重複的例子,因爲分組最有意義。讓我編輯澄清 –