在R中生成多个子集

时间:2015-02-12 23:46:57

标签: r

我有一个很大的字节序列,我想生成一个包含该序列的任意数量子集的列表。我怀疑我需要使用其中一个应用函数,但诀窍是我需要遍历起始位置的向量,序列本身。

以下是我希望它如何运作的示例 -

extrct_by_mod <- function(x, startpos, endpos, lrecl)
{
  x[1:length(x) %% lrecl %in% startpos:endpos]
}

tmp_seq <- letters[1:25]

startpos <- c(0, 2)
endpos   <- c(1, 5)
lrecl    <- 5

list_one   <- extrct_by_mod(x=tmp_seq, startpos=startpos[1], endpos=endpos[1], lrecl=lrecl)
list_two   <- extrct_by_mod(x=tmp_seq, startpos=startpos[2], endpos=endpos[2], lrecl=lrecl)

what_i_want <- list(list_one, list_two)

理想情况下,我希望能够为startpos和endpos添加更多值,从而自动生成更多子集以添加到我的列表中。请注意,子集的长度不同,在某些情况下,甚至不是相同的类型。

我的数据集非常大,因此可以很好地扩展。我意识到这可以通过循环来完成,但我知道你通常想避免在R中循环。

谢谢!

1 个答案:

答案 0 :(得分:0)

通过预先计算模选选择索引来节省一些时间:

> cats <- 1:length(tmp_seq) %% lrecl
> mapply(function(start,end) { tmp_seq[cats %in% start:end]} , startpos, endpos)
[[1]]
 [1] "a" "e" "f" "j" "k" "o" "p" "t" "u" "y"

[[2]]
 [1] "b" "c" "d" "g" "h" "i" "l" "m" "n" "q" "r" "s" "v" "w" "x"

(R apply函数比等效循环更快是不正确的。)