具有重复的同一行组内的操作

时间:2017-03-07 08:36:40

标签: r dataframe dplyr

我想根据以下内容减去每个行组 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行&#34;丢失&#34;沿着计算。

1 个答案:

答案 0 :(得分:1)

我们需要ifelse来防范&#34;空&#34;群组,并使用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