【问题标题】:Replace NA using a vector of column names使用列名向量替换 NA
【发布时间】:2021-06-23 12:53:11
【问题描述】:

我有一个包含NAs 列的数据框,我使用replace_na 替换了这些列。问题是这些列名将来可能会更改,所以我想将这些列名放在一个向量中,然后在 replace_na 函数中使用该向量。我不想一次性更改整个数据框,只是指定的列。当我如下尝试时,代码会运行,但不会更改数据框。任何人都可以建议对代码进行任何修改吗?

library(tidyverse)
col1<-c(9,NA,25,26,NA,51)
col2<-c(9,5,25,26,NA,51)
col3<-c(NA,3,25,26,NA,51)
col4<-c(9,1,NA,26,NA,51)

data<-data.frame(col1,col2,col3,col4, stringsAsFactors = FALSE)

columns<-c(col1,col2)

data<-data%>%
  replace_na(list(columns=0))


【问题讨论】:

    标签: r dplyr tidyr


    【解决方案1】:

    dplyr 选项:

    columns <- c("col1" ,"col2")
    
    dplyr::mutate(data, across(columns, replace_na, 0))
    

    返回:

      col1 col2 col3 col4
    1    9    9   NA    9
    2    0    5    3    1
    3   25   25   25   NA
    4   26   26   26   26
    5    0    0   NA   NA
    6   51   51   51   51
    

    【讨论】:

      【解决方案2】:

      另一种选择是在map_at 中使用coalesce

      • map_at 中的 at 参数可以是您要修改的列名的字符向量
      • 然后我们使用coalesce函数来指定NAs的替换
      library(dplyr)
      library(purrr)
      
      data %>%
        map_at(c("col1","col2"), ~ coalesce(.x, 0)) %>%
        bind_cols()
      
      # A tibble: 6 x 4
         col1  col2  col3  col4
        <dbl> <dbl> <dbl> <dbl>
      1     9     9    NA     9
      2     0     5     3     1
      3    25    25    25    NA
      4    26    26    26    26
      5     0     0    NA    NA
      6    51    51    51    51
      

      【讨论】:

        【解决方案3】:

        columns 值应该是字符串,然后你可以使用is.na 作为 -

        columns<-c("col1","col2")
        
        data[columns][is.na(data[columns])] <- 0
        data
        
        #  col1 col2 col3 col4
        #1    9    9   NA    9
        #2    0    5    3    1
        #3   25   25   25   NA
        #4   26   26   26   26
        #5    0    0   NA   NA
        #6   51   51   51   51
        

        或者使用tidyverse -

        library(dplyr)
        library(tidyr)
        
        data <- data %>% mutate(across(all_of(columns), replace_na, 0))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-06-18
          • 1970-01-01
          • 2017-11-12
          • 1970-01-01
          • 2011-10-04
          • 1970-01-01
          • 2013-12-15
          • 2012-11-10
          相关资源
          最近更新 更多