【问题标题】:Loop over certain columns to replace NAs with 0 in a dataframe循环遍历某些列以将数据框中的 NA 替换为 0
【发布时间】:2017-12-24 19:30:54
【问题描述】:

我花了很多时间尝试编写一个循环来将数据框中某些列的 NA 替换为零,但尚未成功。我已经搜索过,找不到类似的问题。

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 的 NA 设置为 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 替换为零?

【问题讨论】:

  • 不需要循环。试试df[varlist] &lt;- replace(df[varlist], is.na(df[varlist]), 0)

标签: r loops na


【解决方案1】:

这是一个 tidyverse 方法:

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

基本上你说 vars B 和 D 应该由一个定义的函数改变。其中. 对应于相应的列。

【讨论】:

    【解决方案2】:

    这是一个基本的 R 单线

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

    【讨论】:

      【解决方案3】:

      使用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
      

      【讨论】:

        猜你喜欢
        • 2021-02-26
        • 2019-12-16
        • 2012-10-21
        • 2017-07-28
        • 2020-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多