R 如何通过从另一个变量中提取字符串来构建新变量
我有一个类似这样的df,我想在主题中构建一个新变量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
Main
ifMath | 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"))))
dfstr\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您能告诉我如何使用分隔行
来执行此操作吗?非常感谢。有这么多选项的惊人答案:)