R:从字符串集中修剪连续的尾随和前导特殊字符

R:从字符串集中修剪连续的尾随和前导特殊字符,r,character,R,Character,我有一个字符向量列表,长度都相等。示例数据: > a = list('**aaa', 'bb*bb', 'cccc*') > a = sapply(a, strsplit, '') > a [[1]] [1] "*" "*" "a" "a" "a" [[2]] [1] "b" "b" "*" "b" "b" [[3]] [1] "c" "c" "c" "c" "*" 我想确定字符*的所有前后连续出现的索引。然后我想从列表中的所有三个向量中删除这些索引。通过尾随和前导连续字

我有一个字符向量列表,长度都相等。示例数据:

> a = list('**aaa', 'bb*bb', 'cccc*')
> a = sapply(a, strsplit, '')
> a
[[1]]
[1] "*" "*" "a" "a" "a"

[[2]]
[1] "b" "b" "*" "b" "b"

[[3]]
[1] "c" "c" "c" "c" "*"
我想确定字符
*
的所有前后连续出现的索引。然后我想从列表中的所有三个向量中删除这些索引。通过尾随和前导连续字符,我的意思是,例如,第三个字符(
cccc*
)中只出现一次,或者第一个字符中出现多个连续字符(
**aaa

删除后,所有三个字符向量的长度应仍然相同

因此,前两个和最后一个字符应该从所有三个向量中删除

[[1]]
[1] "a" "a"

[[2]]
[1] "*" "b"

[[3]]
[1] "c" "c"
请注意,所需结果的第二个向量仍将有一个前导字符
*
,但该字符在操作后成为第一个字符,因此它应该在中

我尝试使用
which
来识别索引(
sapply(a,函数(x)which(x='*'))
),但这仍然需要一些代码来检测后面的索引


有什么简单的解决方案吗?

首先,就像Richard Scriven在对您的问题的评论中所问的那样,您的输出与您所要求的不一样。您要求删除前导字符和尾随字符,但给定的理想输出只是字符列表中的第3和第4个元素。 这很容易通过以下方式实现

a <- list('**aaa', 'bb*bb', 'cccc*')
alist = sapply(a, strsplit, '')
lapply(alist, function(x) x[3:4])
这在一个正则表达式中是可行的,但是我想,你需要一个用于中间内容的反向引用,而我没有让它起作用

如果您熟悉magrittr软件包及其优秀的管道操作符,您可以更优雅地执行此操作:

library(magrittr)
gsub(pattern = "^(\\*)*", x = a, replacement = "") %>%
gsub(pattern = "(\\*)*$", x = ., replacement = "")

我将用
NA
替换超前和滞后星:

aa <- lapply(setNames(a,seq_along(a)), function(x) {
  star = x=="*"
  toNA = cumsum(!star) == 0 | rev(cumsum(rev(!star))) == 0
  replace(x, toNA, NA)
})
res <- na.omit(DF)
#   X1 X2 X3
# 3  a  *  c
# 4  a  b  c

如果您讨厌data.frames并希望返回列表:
lappy(res,I)
c(unclass(res))
,这会

$X1
[1] "a" "a"

$X2
[1] "*" "b"

$X3
[1] "c" "c"

为什么要删除一些字母?试图澄清问题:如果我在其中一个字符串的开头或结尾发现一个或多个,
*
,我想从所有字符串中删除这些索引。因此,如果其中一个字符串是
**a**
,我想从这个字符串和所有其他字符串中删除索引
1,2,4,5
。试试
i1这会给我一个包含十五个
字符(0)
@akrun的列表:我明白了,如果我将它应用于字符串列表,而不是字符向量列表,它对我有效。谢谢我的理解是,
sapply
只是用来构造示例数据,被描述为“字符向量列表”。@Frank:没错,这只是一个简单的玩具示例,类似于我的真实数据。我不喜欢list或dataframe,字符向量列表正是我使用的软件包中的内容。@zerwck:这对我不适用,所有生成的字符串都应该具有相同的长度。。。
res <- na.omit(DF)
#   X1 X2 X3
# 3  a  *  c
# 4  a  b  c
$X1
[1] "a" "a"

$X2
[1] "*" "b"

$X3
[1] "c" "c"