我阅读了很多其他答案,但似乎没有找到我需要的东西。我正在尝试创建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”不包含“ *”或“ +”,然后将“种子”中的相应列留空
正确的做法是什么?
非常感谢您的帮助,谢谢!
这是一个使用纵梁的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
您也可以使用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创建
这是基本的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>