顺序删除向量元素
Sequentially remove vector elements
我想复制一个向量,其中缺少一个值(按顺序)。
比如我的向量是
value <- 1:7
第一个没有1,第二个没有2,以此类推。最后,该系列在一个向量中。
预期的输出看起来像
2 3 4 5 6 7 1 3 4 5 6 7 1 2 4 5 6 7 1 2 3 5 6 7 1 2 3 4 6 7 1 2 3 4 5 6
有什么聪明的方法可以做到这一点吗?
好吧,您当然可以将其作为单线来完成,但我不确定它是否符合智能要求。例如:
x <- 1:7
do.call("c", lapply(as.list(-1:-length(x)), function(a)x[a]))
这个简单的使用 lapply
创建一个 x
副本的列表,其中每个条目都被删除,然后使用 c
连接它们。 do.call
函数将它的第一个参数(一个函数)应用到它的第二个参数(函数的参数列表)。
为了好玩,也可以只使用 rep
:
> n <- 7
> rep(1:n, n)[rep(c(FALSE, rep(TRUE, n)), length.out=n^2)]
[1] 2 3 4 5 6 7 1 3 4 5 6 7 1 2 4 5 6 7 1 2 3 5 6 7 1 2 3 4 6 7 1 2 3 4 5 7 1 2
[39] 3 4 5 6
但我认为 lapply
更干净。
您可以使用对角矩阵来建立一个逻辑向量,用它来删除适当的值。
n <- 7
rep(1:n, n)[!diag(n)]
# [1] 2 3 4 5 6 7 1 3 4 5 6 7 1 2 4 5 6 7 1 2 3 5 6 7 1 2 3 4 6 7 1 2 3 4 5
# [36] 7 1 2 3 4 5 6
您还可以这样做:
n <- 7
rep(seq(n), n)[-seq(1,n*n,n+1)]
#[1] 2 3 4 5 6 7 1 3 4 5 6 7 1 2 4 5 6 7 1 2 3 5 6 7 1 2 3 4 6 7 1 2 3 4 5 7 1 2 3 4 5 6
我想复制一个向量,其中缺少一个值(按顺序)。
比如我的向量是
value <- 1:7
第一个没有1,第二个没有2,以此类推。最后,该系列在一个向量中。
预期的输出看起来像
2 3 4 5 6 7 1 3 4 5 6 7 1 2 4 5 6 7 1 2 3 5 6 7 1 2 3 4 6 7 1 2 3 4 5 6
有什么聪明的方法可以做到这一点吗?
好吧,您当然可以将其作为单线来完成,但我不确定它是否符合智能要求。例如:
x <- 1:7
do.call("c", lapply(as.list(-1:-length(x)), function(a)x[a]))
这个简单的使用 lapply
创建一个 x
副本的列表,其中每个条目都被删除,然后使用 c
连接它们。 do.call
函数将它的第一个参数(一个函数)应用到它的第二个参数(函数的参数列表)。
为了好玩,也可以只使用 rep
:
> n <- 7
> rep(1:n, n)[rep(c(FALSE, rep(TRUE, n)), length.out=n^2)]
[1] 2 3 4 5 6 7 1 3 4 5 6 7 1 2 4 5 6 7 1 2 3 5 6 7 1 2 3 4 6 7 1 2 3 4 5 7 1 2
[39] 3 4 5 6
但我认为 lapply
更干净。
您可以使用对角矩阵来建立一个逻辑向量,用它来删除适当的值。
n <- 7
rep(1:n, n)[!diag(n)]
# [1] 2 3 4 5 6 7 1 3 4 5 6 7 1 2 4 5 6 7 1 2 3 5 6 7 1 2 3 4 6 7 1 2 3 4 5
# [36] 7 1 2 3 4 5 6
您还可以这样做:
n <- 7
rep(seq(n), n)[-seq(1,n*n,n+1)]
#[1] 2 3 4 5 6 7 1 3 4 5 6 7 1 2 4 5 6 7 1 2 3 5 6 7 1 2 3 4 6 7 1 2 3 4 5 7 1 2 3 4 5 6