操作

2017-03-07 22 views
1

我想減去每個行組ID)執行以下操作:操作

1)組數據ID順序它由訂單

2)減 「C2」到該組的每個元素

數據:

df <- data.frame (ID=rep(c("F1","F2","F3","F4","F5"),c(5,3,6,2,4)), 
       Cond=rep(c("C1","C2","C3","C4"),5), 
       Value=c(1:20), 
      Y_REAL = c(-1,0,1,2,3, 
         0,1,2, 
        -1,0,1,2,3,4, 
         NA,NA, 
         -1,0,1,2)) 

Order  <- c("C1","C2","C3","C4")# order to be sorted the elements 

我下面寫的代碼......但事情都不盡如人意

library(dplyr) 
library(magrittr) 
Out <- df %>% #filter(Wheat_Exp,Field=="2014_P1") %>% 
group_by(ID) %>% 
slice(match(Order,Cond))%>% 
mutate(Y_Diff = Value - lag(Value, default = Value[Cond == "C2"])) 

(更新)

Y_DIFF減去輸出與組中第一個元素的關係(ID)。不正確! 列Y_REAL是我想要獲得的輸出。 此外,3行在計算中「丟失」。

+2

請添加您的預期輸出。 –

+0

@Ranan完成 Axeman,我試過了你的建議,但它不起作用。儘管如此......我已經納入了這個問題,因爲我相信這很容易理解我的觀點 – Rui

回答

1

我們需要ifelse來防範「空」組,並使用which.max找到第一個Value,其中Cond == 'C2'。然後做簡單的減法:

df %>% 
    group_by(ID) %>% 
    mutate(Y_diff = Value - ifelse('C2' %in% Cond, Value[which.max(Cond == 'C2')], NA)) 
Source: local data frame [20 x 5] 
Groups: ID [5] 

     ID Cond Value Y_REAL Y_diff 
    <fctr> <fctr> <int> <dbl> <int> 
1  F1  C1  1  -1  -1 
2  F1  C2  2  0  0 
3  F1  C3  3  1  1 
4  F1  C4  4  2  2 
5  F1  C1  5  3  3 
6  F2  C2  6  0  0 
7  F2  C3  7  1  1 
8  F2  C4  8  2  2 
9  F3  C1  9  -1  -1 
10  F3  C2 10  0  0 
11  F3  C3 11  1  1 
12  F3  C4 12  2  2 
13  F3  C1 13  3  3 
14  F3  C2 14  4  4 
15  F4  C3 15  NA  NA 
16  F4  C4 16  NA  NA 
17  F5  C1 17  -1  -1 
18  F5  C2 18  0  0 
19  F5  C3 19  1  1 
20  F5  C4 20  2  2 
+0

@ Axeman,完美。非常感謝 – Rui