R-我可以使用正则表达式将数据从一列拆分为新的多列和二进制标识符吗?

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

我有一个关于D&D字符的数据集,看起来像这样

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谢谢。这是一种将真/假转换为二进制的黑客方法。例如,
v1
Primary_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),(?