将字符串中的特殊字符提取到新列中

问题描述 投票:1回答:3

我阅读了很多其他答案,但似乎没有找到我需要的东西。我正在尝试创建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)

理想情况下,我只是将它们分成两列,而无需创建其他数据来清理,就像这样:

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

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

正确的做法是什么?

非常感谢您的帮助,谢谢!

r dplyr extract special-characters tidyr
3个回答
0
投票

这是一个使用纵梁的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

0
投票

您也可以使用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创建


0
投票

这是基本的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>
© www.soinside.com 2019 - 2024. All rights reserved.