【问题标题】:r string data cleaningr 字符串数据清理
【发布时间】:2023-03-16 00:22:01
【问题描述】:

我有一些像这样奇怪的字符串混合的数据集

   ID   State
   1    NA
   2    IL
   3    IL,IL,IL
   4    OH,IL
   5    NM,NM,AL,AL
   6    FL,FL,FL

我喜欢

  • 如果 State 值是两个不同的状态,则用 NA 替换它们并且
  • 如果 State 值相同但重复,则将其替换为唯一值。

预期数据集

   ID   State
   1    NA
   2    IL
   3    IL
   4    NA
   5    NA
   6    FL

我尝试了paste(unique(df$State), collapse=","),但没有奏效。非常感谢您对此提出的任何建议。谢谢。

【问题讨论】:

    标签: r string data-cleaning


    【解决方案1】:

    用逗号 (,) 拆分 State 值,如果其中有两个不同的值,则将其替换为 NA 值。使用distinct 仅保留每个ID 的唯一行。

    library(dplyr)
    library(tidyr)
    
    df %>%
      separate_rows(State, sep = ',\\s*') %>%
      group_by(ID) %>%
      mutate(State = replace(State, n_distinct(State) > 1, NA)) %>%
      distinct() %>%
      ungroup()
    
    #     ID State
    #  <int> <chr>
    #1     1 NA   
    #2     2 IL   
    #3     3 IL   
    #4     4 NA   
    #5     5 NA   
    #6     6 FL   
    

    【讨论】:

      【解决方案2】:

      基础 R 解决方案:

      with(
        df,
        vapply(
          State,
          function(x){
            y <- toString(
              unique(
                unlist(
                  strsplit(
                    x,
                    ","
                    )
                  )
                )
              )
            ifelse(
              grepl(
                ",|NA",
                y),
              NA_character_,
              y
            )
          },
          character(1),
          USE.NAMES = FALSE
        )
      )
      

      Tidyverse 解决方案:

      library(tidyverse)
      str_split(df$State, ",") %>% 
        map(function(x) str_c(unique(x), collapse = ", ")) %>% 
        map_chr(function(y) if_else(str_detect(y, ","), NA_character_, y))
      

      数据:

      df <- structure(list(ID = 1:6, State = c(NA, "IL", "IL,IL,IL", "OH,IL", 
      "NM,NM,AL,AL", "FL,FL,FL")), class = "data.frame", row.names = c(NA, 
      -6L))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-21
        • 2021-12-07
        • 2021-11-03
        • 2021-06-06
        • 2011-06-22
        • 1970-01-01
        • 2021-02-05
        相关资源
        最近更新 更多