20

特定のインデックスでベクトルを 2 つに分割する単純なタスクについて疑問に思っています。

splitAt <- function(x, pos){
  list(x[1:pos-1], x[pos:length(x)])
}

a <- c(1, 2, 2, 3)

> splitAt(a, 4)
[[1]]
[1] 1 2 2

[[2]]
[1] 3

私の質問:これには既存の機能が必要ですが、見つかりませんか? もしかしてsplit可能性は?pos=0またはの場合、私の素朴な実装も機能しませんpos>length(a)

4

3 に答える 3

31

改善点は次のとおりです。

splitAt <- function(x, pos) unname(split(x, cumsum(seq_along(x) %in% pos)))

位置のベクトルを取ることができるようになりました:

splitAt(a, c(2, 4))
# [[1]]
# [1] 1
# 
# [[2]]
# [1] 2 2
# 
# [[3]]
# [1] 3

また、単一のリスト項目で元のベクトル全体を返す場合、またはその意味で適切に (主観的に)動作します。代わりにエラーを発生させたい場合は、関数の先頭で使用します。pos <= 0pos >= length(x)stopifnot

于 2013-05-03T11:41:24.367 に答える
4

flodelのソリューションよりも高速かつ/または読みやすく/エレガントな別の代替案:

splitAt <- function(x, pos) {
  unname(split(x, findInterval(x, pos)))
}
于 2016-06-30T14:31:26.887 に答える