R: 字符向量的子集

4
我想从一个字符向量中获取子集。然而,我想要获得vector2,其中包含来自初始向量特定元素之间的元素。
vector <- c("a", "", "b", "c","","d", "e")
vector

如何获取位于元素“b”和“e”之间的所有元素,并获得Vector2?
#Expected result:
vector2
"c","","d"

字面(不够健壮):vector[ (1+match("b", vector)):(-1+match("e", vector)) ],可能有更健壮的方法来处理缺失、中间排序等问题。 - r2evans
4个回答

2
以下是一个选项:

最初的回答

f <- function(x, left, right) {
  idx <- x %in% c(left, right)
  x[as.logical(cumsum(idx) * !idx)]
}

f(vector, "b", "e")
# [1] "c" ""  "d"

第一步是计算idx,方法如下:
vector %in% c("b", "e")
# [1] FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE

then calculate the cumulative sum

cumsum(vector %in% c("b", "e"))
# [1] 0 0 1 1 1 1 2

乘以!vector%in%c(“b”,“e”),得到

最初的回答

cumsum(vector %in% c("b", "e")) * !vector %in% c("b", "e")
# [1] 0 0 0 1 1 1 0

将其转换为逻辑向量并使用它来对 x 进行子集筛选。
对于给定的示例,另一个选项是使用 charmatch
x <- charmatch(c("b", "e"), vector) + c(1, -1)
vector[seq.int(x[1], x[2])]
# [1] "c" ""  "d"

2
您也可以这样做:

最初的回答


vector <- c("a", "", "b", "c","","d", "e")
vector[seq(which(vector=="b")+1,which(vector=="e")-1)]
#[1] "c" ""  "d"

0

使用负下标:

x[-c(1:which(x == 'b'), which(x =='e'):length(x))]
#[1] "c" ""  "d"

如果在找到 b 之前就找到了 e,它将返回空向量:
(y <- rev(x))
#[1] "e" "d" ""  "c" "b" ""  "a"
y[-c(1:which(y == 'b'), which(y =='e'):length(y))]
#character(0)

0

你也可以尝试:

vector[cumsum(vector %in% c("b", "e")) == 1][-1]

[1] "c" ""  "d"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接