R - 在字符的列中拆分字符串并保留特定结果
R - Splitting strings in a column on a character and keeping specific results
这个 link 是解决我想要解决的问题的 90%:R Split String By Delimiter in a column
这是示例输入:
A B C
awer.ttp.net Code 554
abcd.ttp.net Code 747
asdf.ttp.net Part 554
xyz.ttp.net Part 747
期望的结果:
library(dplyr)
df = df %>% mutate(D=gsub("\..*","",A))
A B C D
awer.ttp.net Code 554 awer
abcd.ttp.net Code 747 abcd
asdf.ttp.net Part 554 asdf
xyz.ttp.net Part 747 xyz
但这只会给你第一个点之前的字符串。如果您想要以下内容怎么办?
A B C D
awer.ttp.net Code 554 ttp
abcd.ttp.net Code 747 ttp
asdf.ttp.net Part 554 ttp
xyz.ttp.net Part 747 ttp
我们可以作为一个小组进行捕获。从字符串的开头 (^
) 匹配一个或多个不是 .
([^.]+
) 的字符,后跟 .
后跟另一组不是的字符作为一组捕获的点 (([^.]+)
) 后跟其他字符并替换为捕获组
的反向引用 (\1
)
library(dplyr)
df1 %>%
mutate(D= sub("^[^.]+\.([^.]+)\..*", "\1", A))
# A B C D
#1 awer.ttp.net Code 554 ttp
#2 abcd.ttp.net Code 747 ttp
#3 asdf.ttp.net Part 554 ttp
#4 xyz.ttp.net Part 747 ttp
或使用 extract
library(tidyr)
df1 %>%
extract(A, into = 'D', "^[^.]+\.([^.]+).*", remove = FALSE)
请注意,我们不需要 dplyr
df1$D <- sub("^[^.]+\.([^.]+)\..*", "\1", df1$A)
您可以为此使用 strsplit
函数,并将其包装在 returns 您想要的部分的函数中。
制作你的数据框
temp <- "A B C
awer.ttp.net Code 554
abcd.ttp.net Code 747
asdf.ttp.net Part 554
xyz.ttp.net Part 747
"
df <- read.table(textConnection(temp), header=TRUE, as.is=TRUE )
我们要使用 strsplit
函数,它以给定的模式拆分字符串,returns 一个包含具有不同字符串的向量的列表。例如:
strsplit("A-B-C-D", "-")
#[[1]]
#[1] "A" "B" "C" "D"
将其包装成returns指定部分
的函数
mystrsplit <- function(x, pattern, part=2){
return(strsplit(x, pattern)[[1]][part])
}
# Vectorize it so that it can handle vector arguments of x
mystrsplit <- Vectorize(mystrsplit, vectorize.args = "x")
在 mutate 中使用我们的 mystrsplit
函数:
library(dplyr)
df %>% mutate(D=mystrsplit(A, '\.', 2))
# A B C D
#1 awer.ttp.net Code 554 ttp
#2 abcd.ttp.net Code 747 ttp
#3 asdf.ttp.net Part 554 ttp
#4 xyz.ttp.net Part 747 ttp
这个 link 是解决我想要解决的问题的 90%:R Split String By Delimiter in a column
这是示例输入:
A B C
awer.ttp.net Code 554
abcd.ttp.net Code 747
asdf.ttp.net Part 554
xyz.ttp.net Part 747
期望的结果:
library(dplyr)
df = df %>% mutate(D=gsub("\..*","",A))
A B C D
awer.ttp.net Code 554 awer
abcd.ttp.net Code 747 abcd
asdf.ttp.net Part 554 asdf
xyz.ttp.net Part 747 xyz
但这只会给你第一个点之前的字符串。如果您想要以下内容怎么办?
A B C D
awer.ttp.net Code 554 ttp
abcd.ttp.net Code 747 ttp
asdf.ttp.net Part 554 ttp
xyz.ttp.net Part 747 ttp
我们可以作为一个小组进行捕获。从字符串的开头 (^
) 匹配一个或多个不是 .
([^.]+
) 的字符,后跟 .
后跟另一组不是的字符作为一组捕获的点 (([^.]+)
) 后跟其他字符并替换为捕获组
\1
)
library(dplyr)
df1 %>%
mutate(D= sub("^[^.]+\.([^.]+)\..*", "\1", A))
# A B C D
#1 awer.ttp.net Code 554 ttp
#2 abcd.ttp.net Code 747 ttp
#3 asdf.ttp.net Part 554 ttp
#4 xyz.ttp.net Part 747 ttp
或使用 extract
library(tidyr)
df1 %>%
extract(A, into = 'D', "^[^.]+\.([^.]+).*", remove = FALSE)
请注意,我们不需要 dplyr
df1$D <- sub("^[^.]+\.([^.]+)\..*", "\1", df1$A)
您可以为此使用 strsplit
函数,并将其包装在 returns 您想要的部分的函数中。
制作你的数据框
temp <- "A B C
awer.ttp.net Code 554
abcd.ttp.net Code 747
asdf.ttp.net Part 554
xyz.ttp.net Part 747
"
df <- read.table(textConnection(temp), header=TRUE, as.is=TRUE )
我们要使用 strsplit
函数,它以给定的模式拆分字符串,returns 一个包含具有不同字符串的向量的列表。例如:
strsplit("A-B-C-D", "-")
#[[1]]
#[1] "A" "B" "C" "D"
将其包装成returns指定部分
的函数mystrsplit <- function(x, pattern, part=2){
return(strsplit(x, pattern)[[1]][part])
}
# Vectorize it so that it can handle vector arguments of x
mystrsplit <- Vectorize(mystrsplit, vectorize.args = "x")
在 mutate 中使用我们的 mystrsplit
函数:
library(dplyr)
df %>% mutate(D=mystrsplit(A, '\.', 2))
# A B C D
#1 awer.ttp.net Code 554 ttp
#2 abcd.ttp.net Code 747 ttp
#3 asdf.ttp.net Part 554 ttp
#4 xyz.ttp.net Part 747 ttp