R:字符向量的子集
R: subset of character vector
我想从字符向量中获取一个子集。但是我想从特定元素之间的初始向量中获取包含元素的 vector2 。
vector <- c("a", "", "b", "c","","d", "e")
vector
如何抓取元素"b"和"e"之间的所有元素并得到vector2?
#Expected result:
vector2
"c","","d"
这是一个选项
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
然后计算累计和
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"
您也可以这样做:
vector <- c("a", "", "b", "c","","d", "e")
vector[seq(which(vector=="b")+1,which(vector=="e")-1)]
#[1] "c" "" "d"
带负数下标:
x[-c(1:which(x == 'b'), which(x =='e'):length(x))]
#[1] "c" "" "d"
如果在 b
之前找到 e
它 returns 空向量:
(y <- rev(x))
#[1] "e" "d" "" "c" "b" "" "a"
y[-c(1:which(y == 'b'), which(y =='e'):length(y))]
#character(0)
您也可以试试:
vector[cumsum(vector %in% c("b", "e")) == 1][-1]
[1] "c" "" "d"
我想从字符向量中获取一个子集。但是我想从特定元素之间的初始向量中获取包含元素的 vector2 。
vector <- c("a", "", "b", "c","","d", "e")
vector
如何抓取元素"b"和"e"之间的所有元素并得到vector2?
#Expected result:
vector2
"c","","d"
这是一个选项
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
然后计算累计和
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"
您也可以这样做:
vector <- c("a", "", "b", "c","","d", "e")
vector[seq(which(vector=="b")+1,which(vector=="e")-1)]
#[1] "c" "" "d"
带负数下标:
x[-c(1:which(x == 'b'), which(x =='e'):length(x))]
#[1] "c" "" "d"
如果在 b
之前找到 e
它 returns 空向量:
(y <- rev(x))
#[1] "e" "d" "" "c" "b" "" "a"
y[-c(1:which(y == 'b'), which(y =='e'):length(y))]
#character(0)
您也可以试试:
vector[cumsum(vector %in% c("b", "e")) == 1][-1]
[1] "c" "" "d"