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

计算过渡帧之间的行差异很容易,但由于状态 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

以下方法对您有用吗?

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 中的过渡帧采用不同的值,请将 1 indiff()替换为其他值。

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

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

相关内容

最新更新