Dataframe中的条件填充值

时间:2018-05-06 13:02:47

标签: r dataframe dplyr

我的数据框如下:

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

现在,我希望有条件地将Var3Var4值填入精确低于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 :(得分:3)

使用:

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)

答案 1 :(得分:2)

以下是一些选项。在前2个中,我使用mutate_at从这些列中删除0,然后使用fill中的tidyr向上填充。

在第三个中,如果该列中的值为0,我使用lead从下面获取值。

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

reprex package(v0.2.0)创建于2018-05-06。