【问题标题】:Conditional replacement of NA based on Data type基于数据类型的 NA 条件替换
【发布时间】:2018-09-08 10:01:35
【问题描述】:

我有一个包含 80 多个不同变量的数据库,其中大多数都有 NA。有些变量是整数,有些是因子。 我想做的是开发一个功能: 1.翻阅我的专栏列表; 2.标识列类型; 3. 如果列中包含的数据类型是因子,函数将NA替换为“Others”; 4. 但是,如果列中包含的数据类型是整数,则替换为数字 0。 有任何想法吗? 谢谢各位。

【问题讨论】:

标签: r types integer na


【解决方案1】:
FOO <- function(x){
  if(is.numeric(x)){
    x[is.na(x)] <- 0
  }
  if(is.factor(x)){
    x[is.na(x)] <- "Others"
  }
return(x)
}

现在只需使用lapply 循环遍历多列数据,例如df[1:10] &lt;- lapply(df[1:10], FOO).

注意:这要求因子水平 "Others" 已经存在于您要更改的每个因子变量中。如果不是这种情况,请使用

FOO <- function(x){
  if(is.numeric(x)){
    x[is.na(x)] <- 0
  }
  if(is.factor(x)){
    x <- as.character(x)
    x[is.na(x)] <- "Others"
    x <- as.factor(x)
  }
  return(x)
}

不过,这可能会重新排列因子水平的顺序。

【讨论】:

    【解决方案2】:

    使用dplyrforcats 包:

    library(dplyr)
    library(forcats)
    
    # sample data frame
    df <- data_frame(fac1 = as.factor(c('NY', NA, 'PA', 'MN', 'OH', 'TX', NA)),
                     int1 = as.integer(c(1,2,3,NA,NA,6,7)),
                     fac2 = as.factor(c('red', 'blue', NA, 'green', 'green', NA, 'yellow')),
                     int2 = as.integer(c(1,NA,3,4,5,NA,7)))
    
    df %>% 
      mutate_if(is.integer, funs(replace(., is.na(.), 0))) %>% 
      mutate_if(is.factor, funs(fct_explicit_na(., na_level = 'Other')))
    
    # A tibble: 7 x 4
        fac1  int1   fac2  int2
      <fctr> <dbl> <fctr> <dbl>
    1     NY     1    red     1
    2  Other     2   blue     0
    3     PA     3  Other     3
    4     MN     0  green     4
    5     OH     0  green     5
    6     TX     6  Other     0
    7  Other     7 yellow     7
    

    【讨论】:

      猜你喜欢
      • 2023-02-13
      • 2013-12-11
      • 1970-01-01
      • 2016-08-29
      • 1970-01-01
      • 2016-07-31
      • 2022-01-23
      • 1970-01-01
      • 2020-03-14
      相关资源
      最近更新 更多