Условное значение заполнения в Dataframe - PullRequest
0 голосов
/ 06 мая 2018

У меня есть датафрейм, который выглядит так:

Date        Avc1     Xrt2      Var3     Var4
2017-04-04  0        0         0        0
2017-04-04  10       18        22       25
2017-04-04  8        12        16       20
2017-04-04  5        10        13       18

Теперь я хочу условно заполнить значение Var3 и Var4 точным значением ниже, когда оно равно 0.

Выход:

Date        Avc1     Xrt2      Var3     Var4
2017-04-04  0        0         22       25
2017-04-04  10       18        22       25
2017-04-04  8        12        16       20
2017-04-04  5        10        13       18

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Вот несколько вариантов. В первых 2 я использовал mutate_at, чтобы удалить 0 из этих столбцов, а затем fill из tidyr, чтобы заполнить вверх.

В третьем я использовал lead, чтобы взять значение снизу, если значение в этом столбце равно 0.

library(tidyverse)

df %>%
    mutate_at(vars(Var3, Var4), function(x) ifelse(x == 0, NA, x)) %>%
    fill(Var3, Var4, .direction = "up")
#> # A tibble: 4 x 5
#>   Date        Avc1  Xrt2  Var3  Var4
#>   <date>     <int> <int> <int> <int>
#> 1 2017-04-04     0     0    22    25
#> 2 2017-04-04    10    18    22    25
#> 3 2017-04-04     8    12    16    20
#> 4 2017-04-04     5    10    13    18

df %>%
    mutate_at(vars(Var3, Var4), na_if, 0) %>%
    fill(Var3, Var4, .direction = "up")
#> # A tibble: 4 x 5
#>   Date        Avc1  Xrt2  Var3  Var4
#>   <date>     <int> <int> <int> <int>
#> 1 2017-04-04     0     0    22    25
#> 2 2017-04-04    10    18    22    25
#> 3 2017-04-04     8    12    16    20
#> 4 2017-04-04     5    10    13    18

df %>%
    mutate_at(vars(Var3, Var4), function(x) ifelse(x == 0, lead(x), x))
#> # A tibble: 4 x 5
#>   Date        Avc1  Xrt2  Var3  Var4
#>   <date>     <int> <int> <int> <int>
#> 1 2017-04-04     0     0    22    25
#> 2 2017-04-04    10    18    22    25
#> 3 2017-04-04     8    12    16    20
#> 4 2017-04-04     5    10    13    18

Создано в 2018-05-06 пакетом Представ (v0.2.0).

0 голосов
/ 06 мая 2018

Использование:

df[4:5] <- lapply(df[4:5], function(x) {i <- which(x == 0); x[i] <- x[i+1]; x})

дает:

> df
        Date Avc1 Xrt2 Var3 Var4
1 2017-04-04    0    0   22   25
2 2017-04-04   10   18   22   25
3 2017-04-04    8   12   16   20
4 2017-04-04    5   10   13   18

Другая возможность с na.locf из пакета zoo:

i <- which(df == 0, arr.ind = TRUE)

df[i[i[,2] %in% 4:5,]] <- NA

df <- zoo::na.locf(df, fromLast = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...