【问题标题】:Replace observations with specific values in multiple columns用多列中的特定值替换观察值
【发布时间】:2021-03-28 00:14:48
【问题描述】:

我有一个看起来像这样的数据框。

df <- tibble::tribble(
  ~name,           ~x,  ~y,              ~z,  
  "N/A",           1,   "N/A",           -100, 
  "N A",           3,   "NOt available", -99,
  "N / A",         NA,  "29",              -98,
  "Not Available", -99, "25",              -101,
  "John Smith",    -98, "28",              -1)

我想使用 map() 和/或 data.table() 将字符变量中“N/A”或“N A”的所有观察结果替换为NA

我尝试了以下方法,但似乎不起作用:

chvar <- keep(df,is.character)%>%names()
rpl.NA<- as_mapper(~setDT(df)[.x%in%c("N/A","N A"),.x:=NA])
wrong <- map(chvar,rpl.NA)

这种方法的问题在于它会生成一个包含多个数据帧的列表,而不是简单地返回一个数据帧。 我也试过了

wrong2<-df%>%mutate_at(chvar, list(~replace(., "N/A", NA)))

但这也会产生错误。

我知道我可以通过 library(naniar) 使用以下函数来做到这一点

na_strings <- c("N/A","N A")
df <- dt %>% replace_with_na_at(.vars = chvar,
                                condition = ~.x %in% na_strings)

但是这个函数很慢,我必须把它应用到一个大数据集上。

有谁知道一种快速方便的方法,可以让我在选定数量的观察值上将函数应用于选定数量的变量?

非常感谢您的帮助

最好的问候

【问题讨论】:

    标签: r loops data.table purrr


    【解决方案1】:

    使用replace 的简单基本 R 选项

    replace(df, df == "N/A" | df == "N A", NA)
    

    给予

    # A tibble: 5 x 4
      name              x y                 z
      <chr>         <dbl> <chr>         <dbl>
    1 <NA>              1 <NA>           -100
    2 <NA>              3 NOt available   -99
    3 N / A            NA 29              -98
    4 Not Available   -99 25             -101
    5 John Smith      -98 28               -1
    

    如果你有更多代表NA的模式,你可以试试下面的代码,例如

    replace(df,Reduce(`|`, lapply(c("N/A", "N A", "N / A", "Not Available"), `==`, df)),NA)
    

    【讨论】:

      【解决方案2】:

      base R,我们可以做

      na_strings <- c("N/A","N A")
      df[] <- lapply(df, function(x) replace(x, x %in% na_strings, NA))
      

      【讨论】:

        【解决方案3】:

        使用dplyr,你可以这样做:

        library(dplyr)
        na_strings <- c("N/A","N A")
        
        df <- df %>% 
                 mutate(across(where(is.character), 
                        ~replace(.x, .x %in% na_strings, NA)))
        

        更大的数据集data.table 会更高效:

        library(data.table)
        
        setDT(df)
        df[, (chvar) := lapply(.SD, function(x) replace(x, x %in% na_strings, NA)), 
             .SDcols = chvar]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-10-11
          • 1970-01-01
          • 2020-09-13
          • 2013-07-21
          • 2019-09-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多