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

问题描述 投票:0回答:3

我花了很多时间尝试编写一个循环来用数据帧中的某些列替换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?

r loops na
3个回答
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应该由定义的函数改变。其中.对应于相应的列。


2
投票

这是一个基础R单线

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

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
© www.soinside.com 2019 - 2024. All rights reserved.