【发布时间】:2015-11-30 19:39:14
【问题描述】:
我有一个字符向量列表,长度都相等。示例数据:
> 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, function(x)which(x=='*'))),但这仍然需要一些代码来检测尾随的索引。
对于简单的解决方案有什么想法吗?
【问题讨论】:
-
你为什么要删除一些字母?
-
试图澄清问题:如果我在其中一个字符串的开头或结尾找到一个或多个
*'s,我想从所有字符串中删除这些索引.所以如果其中一个字符串是**a**,我想从这个字符串和所有其他字符串中删除索引1,2,4,5。 -
试试
i1 <- unlist(gregexpr('(?<=\\*)\\*|\\*(?=\\*)|^\\*|\\*$', unlist(a), perl=TRUE));i2 <- setdiff(seq(nchar(a[[1]])), i1[i1>0]); strsplit(substr(unlist(a), i2[1], i2[2]), '') -
这给了我十五个
character(0)的列表 -
@akrun:我明白了,如果我将它应用于字符串列表而不是字符向量列表,它对我有用。谢谢!