R:用上面的值填充一组列中的所有 NA
R: Fill all NAs in a set of columns with the values above
我有一个数据框和 "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
但也许有更优雅的解决方案?
谢谢!
使用 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
您可以使用 tidyr::fill()
和 grep
来确保我们只填写 avars
和 bvars
:
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]
断言列名必须以 a
或 b
开头
或者根据您的评论,使用 avars
和 bvars
:
x %>% fill(grep(paste0(c(avars,bvars), collapse = "|"), names(x)))
这仍然比 for
循环解决方案更好,因为它是矢量化的。
我有一个数据框和 "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
但也许有更优雅的解决方案? 谢谢!
使用 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
您可以使用 tidyr::fill()
和 grep
来确保我们只填写 avars
和 bvars
:
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]
断言列名必须以 a
或 b
或者根据您的评论,使用 avars
和 bvars
:
x %>% fill(grep(paste0(c(avars,bvars), collapse = "|"), names(x)))
这仍然比 for
循环解决方案更好,因为它是矢量化的。