基于重复的逻辑向量元素粘贴字符串

时间:2017-08-07 12:48:34

标签: r

我有一个字符串向量

vec <- c("apple", "banana", "plum", "cherry", "cake", "ginger")

我有一个相应的逻辑向量

lvec <- c(TRUE, FALSE, TRUE, FALSE, FALSE, TRUE)

我想粘贴(paste0)我有序列为FALSE(或TRUE&#39; s)的元素。

期望的输出:

c("apple", "banana", "plum", "cherrycake", "ginger")

3 个答案:

答案 0 :(得分: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 :(得分: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)

答案 2 :(得分:1)

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

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

,并提供:

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