r - 根据最后 n 个字符提取值

标签 r regex gsub qdap

我有一个像下面这样的向量:

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 以保留原始列。

关于r - 根据最后 n 个字符提取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54138533/

相关文章:

javascript - 如何在 JavaScript 中正确格式化正则表达式

java - 正则表达式 [^\p{LD}\s] 的含义是什么?

python - str.extract 从 pandas DataFrame 的后面开始

bash - 在保留格式的同时提取两个模式(包括)之间的字符串

r - Github Action 因 R CMD 检查而失败,使用旧提交?

r - 多个类的 S3 运算符重载

AWK - 更改第二个日期

logstash - 访问 logstash 中的数组元素

c++ - 在 Rcpp 和 C++ 之间转换 vector (使用 Rcpp::as 或 Rcpp::wrap)是否会创建一个新 vector 并复制元素?

r - 如何在 R 中划分缺失数据的不等数据帧