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