3

如果我想对两个向量中的所有元素进行编号,向量 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
4

5 回答 5

4

这是一个向 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
于 2013-01-30T15:51:04.673 回答
1

我刚刚发现的一种方法是:

  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    

但这只有在我的向量是偶数时才有效。必须能够做得更好。

于 2013-01-30T14:30:45.383 回答
1

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

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

max您的系列中的最高数字在哪里。唯一会中断的情况是 ifmax小于 2。

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

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

这将适用于任何集合,除非一个向量根本没有任何元素。

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

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

这会根据 vector1 和 vector2 的长度独立地分配它们的值。

于 2013-01-30T14:31:10.953 回答
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在此列表中使用 usingseq_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
于 2013-01-30T14:35:45.903 回答
1

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

假设您有几个数组,A1并且A2, 带有值,并且您希望将索引链接到这些值,因此您可以说并从if是奇数和if是偶数中index[n]获取相应的值。A1[n/2 + 1]nA2[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]返回A1值,偶数时返回值。如果不等于或小于 1,则会中断。nA2nlength(A2)length(A1)

于 2013-01-30T15:13:19.753 回答