根据最后 n 个字符提取值
Extract values based on last n characters
我有一个如下的向量:
vector
jdjss-jdhs--abc-bec-ndj
kdjska-kvjd-jfj-nej-ndjk
eknd-nend-neekd-nemd-nemdkd-nedke
如何根据 -
分隔符提取最后 3 个值,以便我的结果如下所示:
vector Col1 Col2 Col3
jdjss-jdhs--abc-bec-ndj abc bec ndj
kdjska-kvjd-jfj-nej-ndjk jfj nej ndjk
eknd-nend-neekd-nemd-nemdkd-nedke nemd nemdkd nedke
我尝试过使用 sub 和 qdap 包,但没有成功。
sub( "(^[^-]+[-][^-]+)(.+$)", "\2", df$vector)
qdap::char2end(df$vector, "-", 3)
不知道该怎么做。
您可以使用 tidyr::extract
:
library(tidyr)
vector <- c("jdjss-jdhs--abc-bec-ndj", "kdjska-kvjd-jfj-nej-ndjk", "eknd-nend-neekd-nemd-nemdkd-nedke")
df <- data.frame(vector)
tidyr::extract(df, vector, into = c("Col1", "Col2", "Col3"), "([^-]*)-([^-]*)-([^-]*)$", remove=FALSE)
vector Col1 Col2 Col3
1 jdjss-jdhs--abc-bec-ndj abc bec ndj
2 kdjska-kvjd-jfj-nej-ndjk jfj nej ndjk
3 eknd-nend-neekd-nemd-nemdkd-nedke nemd nemdkd nedke
([^-]*)-([^-]*)-([^-]*)$
模式匹配:
([^-]*)
- 第 1 组 ('Col1'
):-
以外的 0+ 个字符
-
- 一个连字符
([^-]*)
- 第 2 组 ('Col2'
):-
以外的 0+ 个字符
-
- 一个连字符
([^-]*)
- 第 3 组 ('Col3'
):-
以外的 0+ 个字符
$
- 字符串结尾
设置remove=FALSE
以保留原来的列。
您可以使用 base 中的 strsplit。
x <- "eknd-nend-neekd-nemd-nemdkd-nedke"
lastElements <- function(x, last = 3){
strLength <- length(strsplit(x, "-")[[1]])
start <- strLength - (last - 1)
strsplit(x, "-")[[1]][start:strLength]
}
> lastElements(x)
[1] "nemd" "nemdkd" "nedke"
strcapture
,作为 Wiktor tidyr
extract
答案的基础 R 推论:
strcapture("([^-]*)-([^-]*)-([^-]*)$", df$vector, proto=list(Col1="",Col2="",Col3=""))
# Col1 Col2 Col3
#1 abc bec ndj
#2 jfj nej ndjk
#3 nemd nemdkd nedke
您可以使用 strsplit
简单地按 -
拆分字符串并提取最后 n 个元素:
df <- data.frame(vector = c(
"jdjss-jdhs--abc-bec-ndj",
"kdjska-kvjd-jfj-nej-ndjk",
"eknd-nend-neekd-nemd-nemdkd-nedke"),
stringsAsFactors = FALSE
)
cbind(df, t(sapply(strsplit(df$vector, "-"), tail, 3)))
vector 1 2 3
1 jdjss-jdhs--abc-bec-ndj abc bec ndj
2 kdjska-kvjd-jfj-nej-ndjk jfj nej ndjk
3 eknd-nend-neekd-nemd-nemdkd-nedke nemd nemdkd nedke
我有一个如下的向量:
vector
jdjss-jdhs--abc-bec-ndj
kdjska-kvjd-jfj-nej-ndjk
eknd-nend-neekd-nemd-nemdkd-nedke
如何根据 -
分隔符提取最后 3 个值,以便我的结果如下所示:
vector Col1 Col2 Col3
jdjss-jdhs--abc-bec-ndj abc bec ndj
kdjska-kvjd-jfj-nej-ndjk jfj nej ndjk
eknd-nend-neekd-nemd-nemdkd-nedke nemd nemdkd nedke
我尝试过使用 sub 和 qdap 包,但没有成功。
sub( "(^[^-]+[-][^-]+)(.+$)", "\2", df$vector)
qdap::char2end(df$vector, "-", 3)
不知道该怎么做。
您可以使用 tidyr::extract
:
library(tidyr)
vector <- c("jdjss-jdhs--abc-bec-ndj", "kdjska-kvjd-jfj-nej-ndjk", "eknd-nend-neekd-nemd-nemdkd-nedke")
df <- data.frame(vector)
tidyr::extract(df, vector, into = c("Col1", "Col2", "Col3"), "([^-]*)-([^-]*)-([^-]*)$", remove=FALSE)
vector Col1 Col2 Col3
1 jdjss-jdhs--abc-bec-ndj abc bec ndj
2 kdjska-kvjd-jfj-nej-ndjk jfj nej ndjk
3 eknd-nend-neekd-nemd-nemdkd-nedke nemd nemdkd nedke
([^-]*)-([^-]*)-([^-]*)$
模式匹配:
([^-]*)
- 第 1 组 ('Col1'
):-
以外的 0+ 个字符
-
- 一个连字符([^-]*)
- 第 2 组 ('Col2'
):-
以外的 0+ 个字符
-
- 一个连字符([^-]*)
- 第 3 组 ('Col3'
):-
以外的 0+ 个字符
$
- 字符串结尾
设置remove=FALSE
以保留原来的列。
您可以使用 base 中的 strsplit。
x <- "eknd-nend-neekd-nemd-nemdkd-nedke"
lastElements <- function(x, last = 3){
strLength <- length(strsplit(x, "-")[[1]])
start <- strLength - (last - 1)
strsplit(x, "-")[[1]][start:strLength]
}
> lastElements(x)
[1] "nemd" "nemdkd" "nedke"
strcapture
,作为 Wiktor tidyr
extract
答案的基础 R 推论:
strcapture("([^-]*)-([^-]*)-([^-]*)$", df$vector, proto=list(Col1="",Col2="",Col3=""))
# Col1 Col2 Col3
#1 abc bec ndj
#2 jfj nej ndjk
#3 nemd nemdkd nedke
您可以使用 strsplit
简单地按 -
拆分字符串并提取最后 n 个元素:
df <- data.frame(vector = c(
"jdjss-jdhs--abc-bec-ndj",
"kdjska-kvjd-jfj-nej-ndjk",
"eknd-nend-neekd-nemd-nemdkd-nedke"),
stringsAsFactors = FALSE
)
cbind(df, t(sapply(strsplit(df$vector, "-"), tail, 3)))
vector 1 2 3
1 jdjss-jdhs--abc-bec-ndj abc bec ndj
2 kdjska-kvjd-jfj-nej-ndjk jfj nej ndjk
3 eknd-nend-neekd-nemd-nemdkd-nedke nemd nemdkd nedke