如果我想对两个向量中的所有元素进行编号,向量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
答案 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)
我正在添加另一个答案,以解决您对问题的意图,而不是您所说的问题。
假设您有一些数组A1
和A2
,包含值,并且您希望将索引链接到这些值,因此您可以说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]
现在,A1
在n
为奇数时返回A2
个值,在n
为偶数时返回length(A2)
个值。如果length(A1)
不等于或小于{{1}},则会中断。