将dplyr过滤器操作应用于特定行而不会丢失其他数据

时间:2017-08-16 09:55:47

标签: r dplyr

如果之前有人问过,请道歉。我无法找到任何令人满意的答案,虽然听起来应该是一个相当简单的操作。

我有我的数据

  transition_frame                     name state_number lifetime
             <int>                     <chr>        <dbl>    <dbl>
1               38 //Traces_exp1_tif_pair10            1       NA
2               44 //Traces_exp1_tif_pair10            2        6
3              352 //Traces_exp1_tif_pair10            3      308
4              362 //Traces_exp1_tif_pair10            4       10
5              379 //Traces_exp1_tif_pair10            5       17
6              388 //Traces_exp1_tif_pair10            6        9

计算过渡帧之间的行方差异很容易,但是因为没有&#34;过渡&#34;在状态0和1之间,它打破了流程。

如何在不触及任何其他数据的情况下,仅将第一行设为transition_frame - 1(提示,它是37)?

试想,

group_by(name) %>%
filter(state_number == 1) %>%
mutate(lifetime = transition_frame - 1) %>%
unfilter() # To retrieve dropped data

这将导致整个集合,第一行计算,而第一行。

  transition_frame                     name state_number lifetime
             <int>                     <chr>        <dbl>    <dbl>
1               38 //Traces_exp1_tif_pair10            1       37
2               44 //Traces_exp1_tif_pair10            2        6
3              352 //Traces_exp1_tif_pair10            3      308
4              362 //Traces_exp1_tif_pair10            4       10
5              379 //Traces_exp1_tif_pair10            5       17
6              388 //Traces_exp1_tif_pair10            6        9

2 个答案:

答案 0 :(得分:1)

希望类似于以下代码的方法可能会对您有所帮助!

df <- data.frame(transition_frame=c(38,44,352),
                name=c('//Traces_exp1_tif_pair10','//Traces_exp1_tif_pair10','//Traces_exp1_tif_pair10'),
                state_number=c(1,2,3),
                lifetime=c(NA,6,308))
df[df$state_number==1 & is.na(df$lifetime),"lifetime"] <- 
  df[df$state_number==1 & is.na(df$lifetime),"transition_frame"] - 1
df

答案 1 :(得分:1)

以下是否适用于您?

df <- data.frame(transition_frame = c(38, 44, 352, 362, 379, 388),
                 name = rep("//Traces_exp1_tif_pair10", 6),
                 state_number = seq(1, 6))

df %>% mutate(lifetime = diff(c(1, transition_frame)))

  transition_frame                     name state_number lifetime
1               38 //Traces_exp1_tif_pair10            1       37
2               44 //Traces_exp1_tif_pair10            2        6
3              352 //Traces_exp1_tif_pair10            3      308
4              362 //Traces_exp1_tif_pair10            4       10
5              379 //Traces_exp1_tif_pair10            5       17
6              388 //Traces_exp1_tif_pair10            6        9

如果希望状态0中的转换帧采用不同的值,则将diff()中的1替换为其他值。