R:使用上面的值填充一组列中的所有NA

时间:2019-02-13 23:25:02

标签: r tidyr fill

我有一个数据框和“ a”列和“ b”列名称的向量:

x <- data.frame(a1 = c(1, NA, rep(1, 3), NA),
                a2 = c(2, NA, rep(2, 3), NA),
                a3 = c(3, NA, rep(3, 3), NA),
                b1 = c(10, 10, NA, rep(10, 2), NA),
                b2 = c(20, 20, NA, rep(20, 2), NA),
                b3 = c(30, 30, NA, rep(30, 2), NA),
                c = c(2, 3, 5, NA, 9, 8))
avars <- names(x)[1:3]
bvars <- names(x)[4:6]

有没有一种优雅的方法-使用动态变量名称向量'avars'和'bvars'-用它们上面的值填充avars和bvars中的所有NA。

我了解,我可以使用这样的循环:

library(tidyr)
for(i in c(avars, bvars)) x <- x %>% fill(!!i)
x

但是也许有一个更优雅的解决方案? 谢谢!

2 个答案:

答案 0 :(得分:2)

使用Zoo软件包中的na.locf

> library(zoo)
> na.locf(x)
  a1 a2 a3 b1 b2 b3
1  1  2  3 10 20 30
2  1  2  3 10 20 30
3  1  2  3 10 20 30
4  1  2  3 10 20 30
5  1  2  3 10 20 30
6  1  2  3 10 20 30

答案 1 :(得分:1)

您可以将tidyr::fill()grep一起使用,以确保我们仅填写avarsbvars

library(tidyverse)

x %>% fill(grep("^[ab]", names(.)))

  a1 a2 a3 b1 b2 b3  c
1  1  2  3 10 20 30  2
2  1  2  3 10 20 30  3
3  1  2  3 10 20 30  5
4  1  2  3 10 20 30 NA
5  1  2  3 10 20 30  9
6  1  2  3 10 20 30  8

RegEx表达式^[ab]断言列名必须以ab开头

或根据您的评论,使用avarsbvars

x %>% fill(grep(paste0(c(avars,bvars), collapse = "|"), names(x)))

因为它是矢量化的,所以它仍然比for循环解决方案更好。