seq和seq_along,两全其美?

时间:2013-01-30 14:21:32

标签: r

如果我想对两个向量中的所有元素进行编号,向量1将获得所有奇数值,而向量2将获得所有偶数,我可以假设向量的长度为10。

seq(1, 10, by=2)
[1] 1 3 5 7 9

seq(2, 11, by=2)
[1]  2  4  6  8 10

但如果我的矢量只有一个元素,我会遇到问题:

 seq(2)
[1] 1 2

所以我用:

seq_along(2)
[1] 1

但我无法在by=中使用seq_long()。如何使用seq_along

的功能获得seq()的可靠性

这个例子可能会清楚。

想象一下,我有两个清单:

list1 <- list(4)
list2 <- list(4)

list1必须在列表元素中获得偶数名称。 list2必须在列表元素中获得奇怪的名称。

我不知道列表元素会有多长。

seq_along(list1[[1]]) # this will know to only give one name but I cant make it even

seq(list2[[1]]) # this know to give 1 name
#and
seq(2, list1[[1]], by=2) # this gives me even but too nay names

5 个答案:

答案 0 :(得分:3)

这是一个向seq_along添加'by'参数的函数:

seq_along_by = function(x, by=1L, from = 1L) (seq_along(x) - 1L) * by + from

和一些测试用例

> seq_along_by(integer(), 2L)
integer(0)
> seq_along_by(1, 2L)
[1] 1
> seq_along_by(1:4, 2L)
[1] 1 3 5 7
> seq_along_by(1:4, 2.2)
[1] 1.0 3.2 5.4 7.6
> seq_along_by(1:4, -2.2)
[1]  1.0 -1.2 -3.4 -5.6

答案 1 :(得分:1)

我不确定你要做什么,但是如果你想在向量中使用split奇数和偶数元素,你可以这样做:

x <- 1:19
split(x,x%%2)
$`0`
[1]  2  4  6  8 10 12 14 16 18

$`1`
 [1]  1  3  5  7  9 11 13 15 17 19

要提取奇数和偶数元素,请使用lapply在此列表中使用seq_along来枚举元素编号:

x <- rep(c("odd","even"),times=4)
lapply(split(seq_along(x),seq_along(x)%%2),function(y) "["(x,y))
$`0`
[1] "even" "even" "even" "even"

$`1`
[1] "odd" "odd" "odd" "odd"

这当然可以成为一个功能:

split_oe <- function(x) lapply(split(seq_along(x),seq_along(x)%%2),function(y) "["(x,y))
split_oe(1:10)
$`0`
[1]  2  4  6  8 10

$`1`
[1] 1 3 5 7 9

> split_oe(2)
$`1`
[1] 2

答案 2 :(得分:0)

我发现的一种方式是:

  y <- seq_along(1:20)
  y[y %% 2 == 0 ]
  [1]  2  4  6  8 10 12 14 16 18 20
  y[ !y %% 2 == 0 ]
  [1]  1  3  5  7  9 11 13 15 17 19    

但这只会在我的矢量均匀时起作用。必须能够做得更好。

答案 3 :(得分:0)

如果我理解正确,你真正想要的是让'seq'功能分别只返回奇数或烤箱数1..max或2..max。你会这样写:

seq(1, max, by=2) # Odd numbers
seq(2, max, by=2) # Even numbers

max是系列中的最高号码。如果max小于2,则唯一会中断的时间。

更新1 :似乎有一些关于OP请求的讨论。如果我们假设有两个现有的矢量要编号,我们可以使用max <- length(c(vector1, vector2))获得矢量项的总数,以获得所使用的最大数。然后,索引将被分配如下:

vector1 <- seq(1, max, by=2)
vector2 <- seq(2, max, by=2)

当一个向量根本没有任何元素时,这将适用于任何一组EXCEPT。

更新2 :如果您的向量不代表1和max之间的所有值,则可以采用最后一种方法。这就是它的工作方式:

vector1 <- seq(1, length(vector1) * 2, by=2)
vector2 <- seq(1, length(vector2) * 2, by=2)

这可以根据自己的长度独立分配vector1和vector2的值。

答案 4 :(得分:0)

我正在添加另一个答案,以解决您对问题的意图,而不是您所说的问题。

假设您有一些数组A1A2,包含值,并且您希望将索引链接到这些值,因此您可以说index[n]并获得相应的数据如果A1[n/2 + 1]为奇数,则n的值为A2[n/2],如果n为偶数,则为index

我们将构建一个新的向量# Sample arrays A1 <- sample(LETTERS, 5, rep=TRUE) A2 <- sample(LETTERS, 5, rep=TRUE) n_Max <- length(c(A1,A2)) index <- integer(n_Max) index[seq(1,n_Max,by=2)] <- A1 index[seq(2,n_Max,by=2)] <- A2 ,如下所示:

index[n]

现在,A1n为奇数时返回A2个值,在n为偶数时返回length(A2)个值。如果length(A1)不等于或小于{{1}},则会中断。