2017-08-07 111 views
2

我有字符串粘贴串

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") 
+1

但 “香蕉” 设置为FALSE。为什么在那里? – Christoph

+3

可以尝试'tapply(x,data.table :: rleid(y),paste,collapse =“”)'(其中'x <-c(“apple”,“banana”,“plum”,“cherry” “蛋糕”,“姜”)和'y < - c(TRUE,FALSE,TRUE,FALSE,FALSE,TRUE)') –

回答

3

予先用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" 
1

随着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) 
1

从data.table包尝试rleidunname是可选的 - 如果省略,则名称将为序号。

library(data.table) 
unname(tapply(x, rleid(y), paste, collapse = "")) 

,并提供:

[1] "apple"  "banana"  "plum"  "cherrycake" "ginger"