2017-08-07 17 views
2

Iはストリング貼り付け文字列は、

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

のベクトルを持っていると私は

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

は私が持っている要素(paste0)を貼り付ける対応する論理ベクトルを持っていますFALSE(またはTRUE)のシーケンス。

所望の出力:tapply

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

しかし、 "バナナ" はFALSEに設定されています。それはなぜそこにあるのですか? – Christoph

+3

'x < - c(" apple "、" banana "、" plum "、" cherry "、および" "ケーキ"、 "ショウガ") 'と' y < - c(TRUE、FALSE、TRUE、FALSE、FALSE、TRUE) ') –

答えて

3

。 * applyを使用すると、目的のパラメータでペーストを使用できます。

> sapply(split(x, inverse.rle(r)), paste, collapse = "") 
      1   2   3   4   5 
    "apple"  "banana"  "plum" "cherrycake"  "ginger" 
1

、あなたはグループがそれが変更された場合、これらの変更は累積的に加算され、論理ベクトルにdiffを使用してチェックして計算されている

tapply(vec, cumsum(c(1, diff(lvec) != 0)), FUN=function(x) paste(x, collapse="")) 
     1   2   3   4   5 
"apple"  "banana"  "plum" "cherrycake"  "ginger" 

を行うことができます。次に、結果のグループを貼り付けます。

データIが最初rleを使用し、「値」は、容易に所望のグループにデータを分割することができるように変更

vec <- c("apple", "banana", "plum", "cherry", "cake", "ginger") 
lvec <- c(TRUE, FALSE, TRUE, FALSE, FALSE, TRUE) 
1

を与える

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 = "") 

がdata.tableパッケージからrleidをお試しください。 unnameはオプションです。省略した場合、名前はシーケンス番号になります。

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

与える:

[1] "apple"  "banana"  "plum"  "cherrycake" "ginger"  
関連する問題