给定一个向量,比如说 v = 1:10
,可以使用负索引从 v
中删除元素,例如 v [-1]
, v [-length(v)]
, v [-c(2,3)]
,删除分别是第一个,最后一个和第二个/第三个元素。
我想通过传入拆分索引 n来分割
,取值0到 v
length(v)
。以下代码:
v1< - v [1:n]
 v2< - v [-c(1:n)] 



 除 n = 0
外完全正常。现在我知道 1:n
通常是不安全的,应该用 seq_len(n)
替换,但是,赋值 v2< - v [-seq_len( 0)]
生成一个空向量。
有没有办法使用括号子集符号“安全地”执行此操作?否则我知道如何使用头部和尾部来做:


 v1< - head(v,n)
 v2< - tail( v,length(v) - n)



 相关的其他q / as:


 
答案 0 :(得分:4)
您可以在括号内使用if()
语句。例如,如果n
为零,则只返回整个向量,否则删除序列1:n
。
x <- 1:10
n <- 0
x[ if(n == 0) TRUE else -seq_len(n) ] ## n == 0 is !n for the golfers
# [1] 1 2 3 4 5 6 7 8 9 10
n <- 5
x[ if(n == 0) TRUE else -seq_len(n) ]
# [1] 6 7 8 9 10
答案 1 :(得分:4)
v = 1:10
n = 0; split(v, seq_along(v)/min(n,length(v)) <= 1)
#$`FALSE`
# [1] 1 2 3 4 5 6 7 8 9 10
n = 1; split(v, seq_along(v)/min(n,length(v)) <= 1)
#$`FALSE`
#[1] 2 3 4 5 6 7 8 9 10
#$`TRUE`
#[1] 1
n = 10; split(v, seq_along(v)/min(n,length(v)) <= 1)
#$`TRUE`
# [1] 1 2 3 4 5 6 7 8 9 10
n = -10; split(v, seq_along(v)/min(n,length(v)) <= 1)
#$`TRUE`
# [1] 1 2 3 4 5 6 7 8 9 10
n = 100; split(v, seq_along(v)/min(n,length(v)) <= 1)
#$`TRUE`
# [1] 1 2 3 4 5 6 7 8 9 10
在评论
中进一步简化thelatemailsplit(v, seq_along(v) > n)