R 如何通过从另一个变量中提取字符串来构建新变量

R 如何通过从另一个变量中提取字符串来构建新变量,r,R,我有一个类似这样的df,我想在主题中构建一个新变量MainifMath | ELA。示例数据和我的代码为: df<- structure(list(Subject = c("Math", "Math,ELA", "Math,ELA, PE", "PE, Math", "ART,ELA", "PE,ART")), row.names = c(NA, -6L), class

我有一个类似这样的df,我想在主题中构建一个新变量
Main
if
Math | ELA
。示例数据和我的代码为:

df<- structure(list(Subject = c("Math", "Math,ELA", "Math,ELA, PE", 
"PE, Math", "ART,ELA", "PE,ART")), row.names = c(NA, -6L), class = c("tbl_df", 
"tbl", "data.frame"))

df<-df %>%
+ mutate(Main=case_when (grepl("Math|ELA", Subject)~ paste0(str_extract_all(df$Subject, "Math|ELA"))))

df
str\u extract\u all
返回一个
列表
。我们需要循环查看
列表
粘贴/stru c

library(dplyr)
library(stringr)
library(purrr)
df %>%
  mutate(Main = case_when(grepl("Math|ELA", Subject)~ 
        map_chr(str_extract_all(Subject, "Math|ELA"), toString)))
-输出

# A tibble: 6 x 2
#  Subject      Main     
#  <chr>        <chr>    
#1 Math         Math     
#2 Math,ELA     Math, ELA
#3 Math,ELA, PE Math, ELA
#4 PE, Math     Math     
#5 ART,ELA      ELA      
#6 PE,ART       <NA> 

注意:
粘贴本身不起任何作用,在
列表
中,我们需要循环查看
列表


或者另一种选择是使用

trimws(gsub("(Math|ELA)(*SKIP)(*FAIL)|\\w+", "", df$Subject, perl = TRUE), whitespace = ",\\s*")
#[1] "Math"     "Math,ELA" "Math,ELA" "Math"     "ELA"      ""     

str\u extract\u all
返回一个
列表
。我们需要循环查看
列表
粘贴/stru c

library(dplyr)
library(stringr)
library(purrr)
df %>%
  mutate(Main = case_when(grepl("Math|ELA", Subject)~ 
        map_chr(str_extract_all(Subject, "Math|ELA"), toString)))
-输出

# A tibble: 6 x 2
#  Subject      Main     
#  <chr>        <chr>    
#1 Math         Math     
#2 Math,ELA     Math, ELA
#3 Math,ELA, PE Math, ELA
#4 PE, Math     Math     
#5 ART,ELA      ELA      
#6 PE,ART       <NA> 

注意:
粘贴本身不起任何作用,在
列表
中,我们需要循环查看
列表


或者另一种选择是使用

trimws(gsub("(Math|ELA)(*SKIP)(*FAIL)|\\w+", "", df$Subject, perl = TRUE), whitespace = ",\\s*")
#[1] "Math"     "Math,ELA" "Math,ELA" "Math"     "ELA"      ""     

下面是一个使用
regmatches

transform(
  df,
  Main = sapply(
    regmatches(Subject, gregexpr("Math|ELA", Subject)),
    function(x) replace(toString(x), !length(x), NA)
  )
)

       Subject      Main
1         Math      Math
2     Math,ELA Math, ELA
3 Math,ELA, PE Math, ELA
4     PE, Math      Math
5      ART,ELA       ELA
6       PE,ART      <NA>
Subject Main
1数学
2数学,ELA数学,ELA
3数学,ELA,体育数学,ELA
4体育、数学
5艺术,ELA ELA
6体育、艺术

这里是一个使用
regmatches

transform(
  df,
  Main = sapply(
    regmatches(Subject, gregexpr("Math|ELA", Subject)),
    function(x) replace(toString(x), !length(x), NA)
  )
)

       Subject      Main
1         Math      Math
2     Math,ELA Math, ELA
3 Math,ELA, PE Math, ELA
4     PE, Math      Math
5      ART,ELA       ELA
6       PE,ART      <NA>
Subject Main
1数学
2数学,ELA数学,ELA
3数学,ELA,体育数学,ELA
4体育、数学
5艺术,ELA ELA
6体育、艺术

谢谢。如果我们不使用
str\u extract\u all
,还有更好的方法吗?@Stataq您可以使用
separate\u rows
,然后将字符串提取为well@Stataq用另一个选项Updated您能告诉我如何使用
分隔行
来执行此操作吗?非常感谢。有这么多选择的惊人答案:)谢谢。如果我们不使用
str\u extract\u all
,还有更好的方法吗?@Stataq您可以使用
separate\u rows
,然后将字符串提取为well@Stataq用另一个选项Updated您能告诉我如何使用
分隔行
来执行此操作吗?非常感谢。有这么多选项的惊人答案:)