首页 > 解决方案 > 条件 mutate_at 和 lag

问题描述

基于这个问题的扩展,我有一个整洁的小标题,里面有几个“嵌套组”,其中一些NA在最后一行包含 a 。

# A tibble: 16 x 9
# Groups:   VP, Con, Dir [2]
      VP   Con   Dir   Seg time_seg mean_v_seg sd_v_seg mean_abs_v_seg sd_abs_v_seg
   <int> <int> <int> <int>    <int>      <dbl>    <dbl>          <dbl>        <dbl>
 1    10     2     1     1     1810      233.     142.           233.         142. 
 2    10     2     1     2      260      105.      77.0          105.          77.0
 3    10     2     1     3      540      158.      98.0          158.          98.0
 4    10     2     1     4     1470      219.     125.           219.         125. 
 5    10     2     1     5      460      359.     233.           359.         233. 
 6    10     2     1     6      690      281.     149.           281.         149. 
 7    10     2     1     7      760      599.     281.           599.         281. 
 8    10     2     1     8       NA       NA       NA             NA           NA  
 9    10     2     2     1      320       88.0    103.            88.0        103. 
10    10     2     2     2     1110      183.      75.3          183.          75.3
11    10     2     2     3      450       40.6     44.4           40.6         44.4
12    10     2     2     4      600       67.8     53.7           67.8         53.7
13    10     2     2     5     1680      178.     107.           178.         107. 
14    10     2     2     6      730      227.      99.2          227.          99.2
15    10     2     2     7      850      224.     192.           224.         192. 
16    10     2     2     8      840      463.     243.           463.         243.

我现在注意到,对于这些组,NA 实际上应该在第一行而不是最后一行。因此,我正在考虑使用就地替换(我不想要新列)将行lag之间time_segsd_abs_v_seg行中的列中的数据进一步向下移动。

因此,所需的输出将是

# A tibble: 16 x 9
# Groups:   VP, Con, Dir [2]
      VP   Con   Dir   Seg time_seg mean_v_seg sd_v_seg mean_abs_v_seg sd_abs_v_seg
   <int> <int> <int> <int>    <int>      <dbl>    <dbl>          <dbl>        <dbl>
 1    10     2     1     1       NA       NA       NA             NA           NA 
 2    10     2     1     2     1810      233.     142.           233.         142. 
 3    10     2     1     3      260      105.      77.0          105.          77.0
 4    10     2     1     4      540      158.      98.0          158.          98.0 
 5    10     2     1     5     1470      219.     125.           219.         125. 
 6    10     2     1     6      460      359.     233.           359.         233. 
 7    10     2     1     7      690      281.     149.           281.         149. 
 8    10     2     1     8      760      599.     281.           599.         281.  
 9    10     2     2     1      320       88.0    103.            88.0        103. 
10    10     2     2     2     1110      183.      75.3          183.          75.3
11    10     2     2     3      450       40.6     44.4           40.6         44.4
12    10     2     2     4      600       67.8     53.7           67.8         53.7
13    10     2     2     5     1680      178.     107.           178.         107. 
14    10     2     2     6      730      227.      99.2          227.          99.2
15    10     2     2     7      850      224.     192.           224.         192. 
16    10     2     2     8      840      463.     243.           463.         243.

但是,我正在考虑mutate与参数一起使用ifelse,然后我必须指定要进行替换的每一列。因此,我正在考虑将mutate_at-vars()与一起使用ifelse(应该检查该组是否完整)。像这样的事情很接近,但是,它也会生成新的列(我不想要)。有没有dplyr可以解决这个问题的功能?

下面是dput重现。

structure(list(VP = c(10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 
    10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L), Con = c(2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), Dir = c(1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), 
        Seg = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 1L, 2L, 3L, 4L, 5L, 
        6L, 7L, 8L), time_seg = c(1810L, 260L, 540L, 1470L, 460L, 
        690L, 760L, NA, 320L, 1110L, 450L, 600L, 1680L, 730L, 850L, 
        840L), mean_v_seg = c(232.726734030707, 104.655087869347, 
        157.902075043105, 219.283376258725, 359.45973673094, 280.549706434598, 
        599.424071456088, NA, 87.9826401741796, 182.735676197134, 
        40.6448541145307, 67.7977476910328, 177.773637255357, 227.483717669439, 
        224.429379556985, 462.826739492667), sd_v_seg = c(141.879040585992, 
        77.0389438694476, 97.9539089123486, 125.076162880904, 233.204343193672, 
        149.049291752719, 280.885009497318, NA, 102.904347085381, 
        75.3257592307251, 44.4481451785732, 53.7088336445736, 106.75027532838, 
        99.2415032284702, 192.206130493083, 243.219568282535), mean_abs_v_seg = c(232.726734030707, 
        104.655087869347, 157.902075043105, 219.283376258725, 359.45973673094, 
        280.549706434598, 599.424071456088, NA, 87.9826401741796, 
        182.735676197134, 40.6448541145307, 67.7977476910328, 177.773637255357, 
        227.483717669439, 224.429379556985, 462.826739492667), sd_abs_v_seg = c(141.879040585992, 
        77.0389438694476, 97.9539089123486, 125.076162880904, 233.204343193672, 
        149.049291752719, 280.885009497318, NA, 102.904347085381, 
        75.3257592307251, 44.4481451785732, 53.7088336445736, 106.75027532838, 
        99.2415032284702, 192.206130493083, 243.219568282535)), row.names = c(NA, 
    -16L), class = c("grouped_df", "tbl_df", "tbl", "data.frame"), vars = c("VP", 
    "Con", "Dir"), drop = TRUE, indices = list(0:7, 8:15), group_sizes = c(8L, 
    8L), biggest_group_size = 8L, labels = structure(list(VP = c(10L, 
    10L), Con = c(2L, 2L), Dir = 1:2), row.names = c(NA, -2L), class = "data.frame", vars = c("VP", 
    "Con", "Dir"), drop = TRUE))

根据

标签: rdplyr

解决方案


我实际上自己找到了解决方案。

data %>%
  mutate_at(vars(time_seg:sd_abs_v_seg), funs(if(anyNA(.))
                                                lag(., 1)
                                              else
                                                .))

推荐阅读