循环遍历某些列,以在数据帧中将N替换为0

时间:2017-12-24 19:30:55

标签: r loops na

我花了很多时间尝试编写一个循环,用数据框中的某些列替换NAs并且还没有成功。我搜索过,找不到类似的问题。

df <- data.frame(A = c(2, 4, 6, NA, 8, 10),
             B = c(NA, 10, 12, 14, NA, 16),
             C = c(20, NA, 22, 24, 26, NA),
             D = c(30, NA, NA, 32, 34, 36))
df

给我:

   A  B  C  D
1  2 NA 20 30
2  4 10 NA NA
3  6 12 22 NA
4 NA 14 24 32
5  8 NA 26 34
6 10 16 NA 36

我想仅为B列和D列设置NAs为0.使用单独的代码行,我可以:

df$B[is.na(df$B)] <- 0
df$D[is.na(df$D)] <- 0

但是,我想使用循环,因为我的实际数据集中有很多变量。

我找不到只循环B列和D列的方法,所以我得到:

df

   A  B  C  D
1  2  0 20 30
2  4 10 NA  0
3  6 12 22  0
4 NA 14 24 32
5  8  0 26 34
6 10 16 NA 36

基本上,我想使用变量列表将循环应用于数据框:

varlist <- c("B", "D") 

如何使用变量列表仅覆盖数据框中的某些列以用零替换NA?

3 个答案:

答案 0 :(得分:3)

这是一个整齐的方法:

library(tidyverse)
df %>%
  mutate_at(.vars = vars(B, D), .funs = funs(ifelse(is.na(.), 0, .)))
#output:
   A  B  C  D
1  2  0 20 30
2  4 10 NA  0
3  6 12 22  0
4 NA 14 24 32
5  8  0 26 34
6 10 16 NA 36

基本上你说变量B和D应该由定义的函数改变。 .对应于相应列的位置。

答案 1 :(得分:2)

这里是基础R单行

df[, varlist][is.na(df[, varlist])] <- 0

答案 2 :(得分:1)

使用zoo包,我们可以填充选定的列。

 library(zoo)
 df[varlist]=na.fill(df[varlist],0)  
  df
    A  B  C  D
 1  2  0 20 30
 2  4 10 NA  0
 3  6 12 22  0
 4 NA 14 24 32
 5  8  0 26 34
 6 10 16 NA 36

在基地R我们可以有

 df[varlist]=lapply(df[varlist],function(x){x[is.na(x)]=0;x})
  df
    A  B  C  D
 1  2  0 20 30
 2  4 10 NA  0
 3  6 12 22  0
 4 NA 14 24 32
 5  8  0 26 34
 6 10 16 NA 36