【问题标题】:Extracting special character in string to new column将字符串中的特殊字符提取到新列
【发布时间】:2020-06-14 23:29:25
【问题描述】:

我阅读了很多其他答案,但似乎没有找到我需要的东西。我正在尝试创建 NFL 球队记录数据的数据库,但我无法正确创建“种子”的新变量并保留数据。所以我有一些NFL球队的名字,在他们的一些末尾有特殊字符,表示赢得了他们的分区或外卡季后赛席位,我想保留。例如这里是我的 df:

Tm
New England Patriots*
Buffalo Bills+
New York Jets
Miami Dolphins

我知道这行得通,但似乎不是正确的方法

#create new variable of "Seed"
df <- df %>% dplyr::mutate(Seed = Tm)

#remove all but special characters from "Seed"
df$Seed=gsub("[A-z0-9. ]", "", df$Seed)

#remove special characters from "Tm"
df$Tm=gsub("[\\*\\+]", "", df$Tm)

理想情况下,我想做的只是将它们分成 2 列而不创建额外的数据来清理,如下所示:

Tm                       Seed
New England Patriots     *
Buffalo Bills            +
New York Jets
Miami Dolphins

在伪代码中:创建新变量“Seed” -> 从“Tm”中提取和删除特殊字符“*”和“+”并转移到新变量“Seed” -> 如果“Tm”不包含“* " 或 "+" 然后将 "种子" 中的相应列留空

这样做的正确方法是什么?

非常感谢任何帮助,谢谢!

【问题讨论】:

  • strcapture("(.+?)(\\W*$)",df$Tm,data.frame(Tm = character(),speed = character()))

标签: r dplyr extract special-characters tidyr


【解决方案1】:

这是一个使用 stringr 的 tidyverse 解决方案。

library("stringr")
library("dplyr")

df <- tibble(Tm = c("New England Patriots*", "Buffalo Bills+", "New York Jets"))

df <- df %>%
  mutate(
    Seed = str_extract(Tm, "[\\+\\*]$"),
    Tm = str_replace(Tm, "[\\+\\*]$", "")
  )

> df
# A tibble: 3 x 2
  Tm                   Seed
  <chr>                <chr>
1 New England Patriots *
2 Buffalo Bills        +
3 New York Jets        NA

【讨论】:

    【解决方案2】:

    您也可以使用 tidyr 的 extract 函数来做到这一点。

    library(tidyr)
    df <- data.frame(Tm = c("New England Patriots*", "Buffalo Bills+",
                            "New York Jets", "Miami Dolphins"))
    
    df %>%
      extract(col = Tm, regex = "^([^\\*\\+]+)([\\+\\*]?)$",
              into = c("Tm", "Seed"))
    #>                     Tm Seed
    #> 1 New England Patriots    *
    #> 2        Buffalo Bills    +
    #> 3        New York Jets     
    #> 4       Miami Dolphins
    

    reprex package (v0.3.0) 于 2020-06-14 创建

    【讨论】:

    • 这太好了,非常感谢!如果您想要空白而不是 NA 用于没有特殊字符的行,则这需要少一步。
    【解决方案3】:

    这是一个基本的 R 方法:

    #Extract + or * at the end of the string 
    temp <- regmatches(df$Tm, gregexpr('[+*]$', df$Tm))
    #Replace 0 length characters with NA
    temp[lengths(temp) == 0] <- NA
    #Assign as new column
    df$Seed <- unlist(temp)
    #Remove from original column
    df$Tm <- sub('[+*]$', '', df$Tm) 
    df
    #                    Tm Seed
    #1 New England Patriots    *
    #2        Buffalo Bills    +
    #3        New York Jets <NA>
    #4       Miami Dolphins <NA>
    

    【讨论】:

      猜你喜欢
      • 2017-11-10
      • 1970-01-01
      • 2019-12-02
      • 2021-01-21
      • 1970-01-01
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      相关资源
      最近更新 更多