gpt4 book ai didi

regex - 带有正则表达式的字符串中第一个和最后一个非点的位置

转载 作者:行者123 更新时间:2023-12-01 09:13:24 24 4
gpt4 key购买 nike

我希望定位字符串的第一个和最后一个非点元素的位置。理想情况下,我想在基础 R 中使用 regex 来执行此操作。我已经编写了解决问题的 R 代码。但是,我对 regex 解决方案感兴趣。感谢您的任何建议。

这是一个示例数据集和 R 代码以获得所需的结果。此代码拆分字符串并使用 which 来定位每个非点的位置。然后我用 aggregatemerge 逐行获取 minmax。不过,我怀疑 regex 会更有效率,也更有趣。

my.data <- read.table(text = '
my.string state cov
11....... A 1
111...... A 2
.1.1..... B 3
....1.... B 4
..1.11... C 5
...1..... C 6
......... D 7
.....1.1. D 8
', header = TRUE, stringsAsFactors = FALSE)

new.data <- data.frame(do.call(rbind, strsplit(my.data$my.string,'')), my.data[,2:3], stringsAsFactors = FALSE)
new.data2 <- new.data[,1:9]

new.data2[new.data2 == '.'] <- NA

new.data2 <- t(apply(new.data2, 1, as.numeric))

not.NA <- as.data.frame(which(!is.na(new.data2), arr.ind = TRUE))

my.min.max3 <- with(not.NA, aggregate(not.NA$col, by = list(not.NA$row), FUN = function(x) c(MIN = min(x), MAX = max(x)) ))
my.min.max3 <- do.call(data.frame, my.min.max3)
colnames(my.min.max3) <- c('my.row', 'min', 'max')
my.min.max3

my.row <- 1:nrow(my.data)

my.output <- merge(my.row, my.min.max3, by.x=0, by.y = 'my.row', all=TRUE)
my.output <- my.output[,-1]
colnames(my.output) <- c('my.row', 'min', 'max')
my.output

#
# my.row min max
# 1 1 1 2
# 2 2 1 3
# 3 3 2 4
# 4 4 5 5
# 5 5 3 6
# 6 6 4 4
# 7 7 NA NA
# 8 8 6 8
#

最佳答案

你可以这样做,

> data.frame(my.data[,1], do.call(rbind, gregexpr("^\\.*\\K[^.]|[^.](?=\\.*$)", my.data[,1], perl=T)))
my.data...1. X1 X2
1 11....... 1 2
2 111...... 1 3
3 .1.1..... 2 4
4 ....1.... 5 5
5 ..1.11... 3 6
6 ...1..... 4 4
7 ......... -1 -1
8 .....1.1. 6 8

关于regex - 带有正则表达式的字符串中第一个和最后一个非点的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29229333/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com