如何通过"not"select提取字符串的子串?

How to extract the substring of a string by "not" select?

我有一个奇怪的日期列写成

1012003 表示 2003 年 1 月 1 日, 8132003 代表 2003 年 8 月 13 日 2003 年 6 月 8 日的 6082003 12172003 为 12/17/2003 使用

stri_sub(df$date,-4) 

我得到年份或最后 4 位数字

正在使用

stri_sub(df$date,-6,-5)

我知道日期了。我如何获得月份?

我想做一些事情,根据选择最右边的 6 个来选择剩下的内容。

我认为这样的方法可能有效

  stri_sub(!df$date,-6)

我想留下 1、8、6 和 12。

这里有一个方法:

> x <- c('1012003', '8132003', '6082003', '12172003')
> substr(x, 1, nchar(x) - 6)
[1] "1"  "8"  "6"  "12"

您可以添加一个前导零,转换为实际日期,然后用它们做任何您想做的事...

v <- c(1012003, 8132003, 6082003 , 12172003)

# Add leading zero if needed
new.v <- sprintf("%08d", v)
#[1] "01012003" "08132003" "06082003" "12172003"

# Convert to date
v.dates <- as.Date(new.v, format = "%m%d%Y")
#[1] "2003-01-01" "2003-08-13" "2003-06-08" "2003-12-17"

# extract month-numbers
lubridate::month(v.dates)
#[1]  1  8  6 12

我们可以扩展 substr() 一点。

substr2 <- Vectorize(function(x, start, stop) {
  stopifnot(sign(start) + sign(stop) != 0)
  rv <- function(i) Reduce(paste0, rev(el(strsplit(i, ''))))
  if (start < 0) {
    rv(substr(rv(x), -start, -stop))
  } else {
    substr(x, start, stop)
  }
}, USE.NAMES=FALSE)

用法

substr2(z, -1, -4)  ## years
# [1] "2003" "2003" "2003" "2003"

substr2(z, -5, -6)  ## days
# [1] "01" "13" "08" "17"

substr2(z, -7, -8)  ## months
# [1] "1"  "8"  "6"  "12"

数据:

z <- c('1012003', '8132003', '6082003', '12172003')