我有字符串粘貼串
vec <- c("apple", "banana", "plum", "cherry", "cake", "ginger")
的向量和我有一個相應的邏輯矢量
lvec <- c(TRUE, FALSE, TRUE, FALSE, FALSE, TRUE)
我想粘貼(paste0)其中,I具備的要素FALSE(或TRUE)的序列。
所需的輸出:
c("apple", "banana", "plum", "cherrycake", "ginger")
我有字符串粘貼串
vec <- c("apple", "banana", "plum", "cherry", "cake", "ginger")
的向量和我有一個相應的邏輯矢量
lvec <- c(TRUE, FALSE, TRUE, FALSE, FALSE, TRUE)
我想粘貼(paste0)其中,I具備的要素FALSE(或TRUE)的序列。
所需的輸出:
c("apple", "banana", "plum", "cherrycake", "ginger")
予先用rle
然後修改「值」,以便能夠容易地將數據拆分成所需的基團。然後使用* apply,我們可以使用粘貼所需的參數。
x <- c("apple", "banana", "plum", "cherry", "cake", "ginger")
y <- c(TRUE, FALSE, TRUE, FALSE, FALSE, TRUE)
r <- rle(y)
r$values <- seq_along(r$values)
sapply(split(x, inverse.rle(r)), paste, collapse = "")
# alternatively but I didn't initially think of tapply
tapply(x, inverse.rle(r), paste, collapse = "")
其給出
> sapply(split(x, inverse.rle(r)), paste, collapse = "")
1 2 3 4 5
"apple" "banana" "plum" "cherrycake" "ginger"
隨着tapply
,你可以做
tapply(vec, cumsum(c(1, diff(lvec) != 0)), FUN=function(x) paste(x, collapse=""))
1 2 3 4 5
"apple" "banana" "plum" "cherrycake" "ginger"
在組上的邏輯矢量使用diff
,並檢查它是否改變了計算,這些變化是累加得到的。然後,將所得到的組粘貼在一起。
數據
vec <- c("apple", "banana", "plum", "cherry", "cake", "ginger")
lvec <- c(TRUE, FALSE, TRUE, FALSE, FALSE, TRUE)
從data.table包嘗試rleid
。 unname
是可選的 - 如果省略,則名稱將爲序號。
library(data.table)
unname(tapply(x, rleid(y), paste, collapse = ""))
,並提供:
[1] "apple" "banana" "plum" "cherrycake" "ginger"
但 「香蕉」 設置爲FALSE。爲什麼在那裏? – Christoph
可以嘗試'tapply(x,data.table :: rleid(y),paste,collapse =「」)'(其中'x <-c(「apple」,「banana」,「plum」,「cherry」 「蛋糕」,「姜」)和'y < - c(TRUE,FALSE,TRUE,FALSE,FALSE,TRUE)') –