我的数据框如下:
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
答案 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。