2

我有一个如下所示的向量:

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)

不知道该怎么做。

4

4 回答 4

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

于 2019-01-10T23:51:11.893 回答
2

您可以从基础使用 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" 

于 2019-01-10T23:53:32.257 回答
1

-您可以通过使用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
于 2019-01-11T00:05:42.530 回答
0

strcapture,作为tidyr extractWiktor 答案的基本 R 推论:

strcapture("([^-]*)-([^-]*)-([^-]*)$", df$vector, proto=list(Col1="",Col2="",Col3=""))
#  Col1   Col2  Col3
#1  abc    bec   ndj
#2  jfj    nej  ndjk
#3 nemd nemdkd nedke
于 2019-01-10T23:56:43.193 回答