如果为NA,则填充前一列的列

时间:2017-11-17 19:27:54

标签: r dataframe dplyr

我有一个像这样的数据框

df <- data.frame(v1 = 10:14, v2 = c(NA, 1, NA, 3, 6), v3 = c(1, NA, NA, 9, 4))

  v1 v2 v3
1 10 NA  1
2 11  1 NA
3 12 NA NA
4 13  3  9
5 14  6  4

我现在想用前一列的值填充NAs,所以看起来像这样:

  v1 v2 v3
1 10 10  1
2 11  1  1
3 12 12 12
4 13  3  9
5 14  6  4

我知道如何手动执行此操作,如下所示:

df$v2 <- ifelse(is.na(df$v2), df$v1, df$v2)

如何针对包含多列的完整数据框自动执行此操作?

5 个答案:

答案 0 :(得分:7)

您可以使用tidyr中的library(dplyr) library(tidyr) data.frame(t(df)) %>% fill(., names(.)) %>% t()

执行此操作
   v1 v2 v3
X1 10 10  1
X2 11  1  1
X3 12 12 12
X4 13  3  9
X5 14  6  4

<强>结果:

df

注意:

基本上,我调换a = np.subtract(a, 0., dtype=np.float32),向下填充每一列,然后将其转换回原始方向

答案 1 :(得分:5)

var elt = $('#searchGeoBottom'); // get element
elt.tagsinput({....}); // initialize tagsinput
elt.tagsinput('add', searchGeo[0]); // adding one object at a time and not an array

这将在NA列的条纹上传播值。如果您不想这样做,只需颠倒for循环声明中索引的顺序。

答案 2 :(得分:5)

Reduce使用ifelse的另一个选项:

df[] <- Reduce(function(x, y) ifelse(is.na(y), x, y), df, accumulate = TRUE)

df
#  v1 v2 v3
#1 10 10  1
#2 11  1  1
#3 12 12 12
#4 13  3  9
#5 14  6  4

答案 3 :(得分:3)

您可以使用t(apply(df, 1, function(x){ replace(x, is.na(x), x[cumsum(!is.na(x))][is.na(x)]) })) # v1 v2 v3 #[1,] 10 10 1 #[2,] 11 1 1 #[3,] 12 12 12 #[4,] 13 3 9 #[5,] 14 6 4 但请注意输出将是矩阵

console.log(...)

答案 4 :(得分:3)

使用zoo na.locf

data.frame(t(apply(df,1,function(x) na.locf(x))))
  v1 v2 v3
1 10 10  1
2 11  1  1
3 12 12 12
4 13  3  9
5 14  6  4