R-我可以使用正则表达式将数据从一列拆分为新的多列和二进制标识符吗?
我有一个关于D&D字符的数据集,看起来像这样R-我可以使用正则表达式将数据从一列拆分为新的多列和二进制标识符吗?,r,regex,data-wrangling,R,Regex,Data Wrangling,我有一个关于D&D字符的数据集,看起来像这样 Race Class Level AC Human Fighter | Wizard 10 15 Elf Wizard 8 10 Human Rogue 6 12 Dwarf Barbarian 15 18 我想分离由“|”表示的多类 另外,如果一个角色不是多类的,我想在该槽中放置一个“N
Race Class Level AC
Human Fighter | Wizard 10 15
Elf Wizard 8 10
Human Rogue 6 12
Dwarf Barbarian 15 18
我想分离由“|”表示的多类
另外,如果一个角色不是多类的,我想在该槽中放置一个“NA”或“None”
Race Primary_Class Level AC Subclass Multiclass
Human Fighter 10 15 Wizard 1
Elf Wizard 8 10 NA 0
Human Rogue 6 12 NA 0
Dwarf Barbarian 15 18 NA 0
有干净的方法吗?我们可以使用
separate
将“类”分成两列(“主类”、“子类”),方法是将sep
指定为零或多个空格(\\s*
),后跟
和零或多个空格(\\s*
),然后通过检查'Subclass'NA
元素
library(dplyr)
library(tidyr)
separate(df1, Class, into = c('Primary_Class', 'Subclass'),
'\\s*\\|\\s*', extra = 'merge') %>%
mutate(Multiclass = +(!is.na(Subclass)))
# Race Primary_Class Subclass Level AC Multiclass
#1 Human Fighter Wizard 10 15 1
#2 Elf Wizard <NA> 8 10 0
#3 Human Rogue <NA> 6 12 0
#4 Dwarf Barbarian <NA> 15 18 0
库(dplyr)
图书馆(tidyr)
分离(df1,类,分为=c('Primary_Class','Subclass'),
“\\s*\\\\\\\\\\\\\\\\\\\s*”,额外=“合并”)%>%
突变(多类=+(!is.na(子类)))
#Race Primary_类子类级别AC多类
#1人类战斗机向导10 15 1
#2精灵精灵8 10 0
#3人类盗贼6120
#4矮人野蛮人15180
数据
df1我们可以使用separate
将“类”分为两列(“主类”、“子类”),方法是将sep
指定为零或多个空格(\\s*
),后跟
和零或多个空格(\\s*
),然后通过检查'Subclass'NA
元素
library(dplyr)
library(tidyr)
separate(df1, Class, into = c('Primary_Class', 'Subclass'),
'\\s*\\|\\s*', extra = 'merge') %>%
mutate(Multiclass = +(!is.na(Subclass)))
# Race Primary_Class Subclass Level AC Multiclass
#1 Human Fighter Wizard 10 15 1
#2 Elf Wizard <NA> 8 10 0
#3 Human Rogue <NA> 6 12 0
#4 Dwarf Barbarian <NA> 15 18 0
库(dplyr)
图书馆(tidyr)
分离(df1,类,分为=c('Primary_Class','Subclass'),
“\\s*\\\\\\\\\\\\\\\\\\\s*”,额外=“合并”)%>%
突变(多类=+(!is.na(子类)))
#Race Primary_类子类级别AC多类
#1人类战斗机向导10 15 1
#2精灵精灵8 10 0
#3人类盗贼6120
#4矮人野蛮人15180
数据
df1您可以使用三个ifelse
子句、grepl
以及分别使用\\1
和\\2
的反向引用来匹配所讨论的模式,并使用gsub
操作匹配:
df1$Primary_class <- ifelse(grepl("\\|", df1$Class),
gsub("([A-z]+)\\s\\|\\s([A-z]+)", "\\1", df1$Class), df1$Class)
df1$Subclass <- ifelse(grepl("\\|", df1$Class),
gsub("([A-z]+)\\s\\|\\s([A-z]+)", "\\2", df1$Class), "NA")
df1$Multiclass <- ifelse(grepl("\\|", df1$Class), 1, 0)
df1
Race Class Level AC Primary_class Multiclass Sub_class
1 Human Fighter | Wizard 10 15 Fighter 1 Wizard
2 Elf Wizard 8 10 Wizard 0 NA
3 Human Rogue 6 12 Rogue 0 NA
4 Dwarf Barbarian 15 18 Barbarian 0 NA
df1$Primary\u class您可以使用三个ifelse
子句、grepl
以及分别使用\\1
和\\2
的反向引用来匹配所讨论的模式,并使用gsub
操作匹配:
df1$Primary_class <- ifelse(grepl("\\|", df1$Class),
gsub("([A-z]+)\\s\\|\\s([A-z]+)", "\\1", df1$Class), df1$Class)
df1$Subclass <- ifelse(grepl("\\|", df1$Class),
gsub("([A-z]+)\\s\\|\\s([A-z]+)", "\\2", df1$Class), "NA")
df1$Multiclass <- ifelse(grepl("\\|", df1$Class), 1, 0)
df1
Race Class Level AC Primary_class Multiclass Sub_class
1 Human Fighter | Wizard 10 15 Fighter 1 Wizard
2 Elf Wizard 8 10 Wizard 0 NA
3 Human Rogue 6 12 Rogue 0 NA
4 Dwarf Barbarian 15 18 Barbarian 0 NA
df1$Primary_class我们可以使用sub
删除“|”
之后的所有内容,stru extract
提取“|”
之后的所有内容,并使用stru detect
检测数据中是否存在“|”
library(dplyr)
library(stringr)
df %>%
mutate(Primary_Class = trimws(sub('\\|.*', '', Class)),
Subclass = str_extract(Class, "(?<=\\|).*"),
Multiclass = +(str_detect(Class, "\\|"))) %>%
select(-Class)
# Race Level AC Primary_Class Subclass Multiclass
#1 Human 10 15 Fighter Wizard 1
#2 Elf 8 10 Wizard <NA> 0
#3 Human 6 12 Rogue <NA> 0
#4 Dwarf 15 18 Barbarian <NA> 0
库(dplyr)
图书馆(stringr)
df%>%
突变(主类=trimws(子类('\\\\.*','',类)),
Subclass=str_extract(Class),(?我们可以使用sub
删除“|”
之后的所有内容,str_extract
提取“|”
之后的所有内容,并使用str|u detect
检测数据中是否存在“
library(dplyr)
library(stringr)
df %>%
mutate(Primary_Class = trimws(sub('\\|.*', '', Class)),
Subclass = str_extract(Class, "(?<=\\|).*"),
Multiclass = +(str_detect(Class, "\\|"))) %>%
select(-Class)
# Race Level AC Primary_Class Subclass Multiclass
#1 Human 10 15 Fighter Wizard 1
#2 Elf 8 10 Wizard <NA> 0
#3 Human 6 12 Rogue <NA> 0
#4 Dwarf 15 18 Barbarian <NA> 0
库(dplyr)
图书馆(stringr)
df%>%
突变(主类=trimws(子类('\\\\.*','',类)),
Subclass=str_extract(Class),(?我觉得这真的很有趣。我以前从未见过这种+
方法。你能解释一下它是如何工作的吗?当然!我已经做过了。我不明白为什么有人投了你反对票,而我在我发表评论和提出问题之前,对你的帖子投了更高的票)。这可能就是你在这里看不到负数的原因。@rdornas谢谢。这是一种将真/假转换为二进制的黑客方法。例如,v1我觉得这很有趣。我以前从未见过这种+
方法。你能解释一下它是如何工作的吗?当然!我已经做过了。我不明白为什么有人给你一个投反对票,我把你的帖子投了更高的票(就在我发表评论和提问之前)。这可能就是你在这里没有看到负数的原因。@rdornas谢谢。这是一种将真/假转换为二进制的黑客方法。例如,v1Primary_class
is missing也可以使用这个:df1%>%mutate(Primary_class=str_extract(?Primary\u Class
is missing)也可以使用这个:df1%>%mutate(Primary\u Class=str\u extract(Class,***=\\s\\\\)”,Subclass=str\u extract(Class),(?