创建一个向量列表,表示R中两个相等长度向量的第n个值之间的整数

时间:2017-01-24 10:17:05

标签: r vector concatenation

我想生成一个不等向量列表,它表示两个现有向量n和L的 n 值之间的整数。

实施例

 > n 
[1]   1   2   3   4   5   6   7

> L
[1]   2   2   4   4   4   4   4

对于n的每个值,我想在n> L时连接L和n之间的整数,或者当L = n时检索n的单个值,或者当L> n时用值0替换。我想得到一个具有不相等向量的列表(或其他实体)。理想输出:

i
1 0
2 2
3 0
4 4
5 4 5
6 4 5 6
7 4 5 6 7

我曾尝试使用冒号运算符(意​​图稍后替换负值),例如

c((L):n) 

但它出现了错误:

numerical expression has 205 elements: only the first used

2 个答案:

答案 0 :(得分:1)

我们可以使用Map

f1 <- function(x,y) c(x, if(x < y) 0 else if(x == y) x else y:x)
Map(f1, n, L)
#[[1]]
#[1] 1 0

#[[2]]
#[1] 2 2

#[[3]]
#[1] 3 0

#[[4]]
#[1] 4 4

#[[5]]
#[1] 5 4 5

#[[6]]
#[1] 6 4 5 6

#[[7]]
#[1] 7 4 5 6 7

如果我们需要vector

sapply(Map(f1, n, L), paste, collapse=" ")
#[1] "1 0"       "2 2"       "3 0"       "4 4"       "5 4 5"     "6 4 5 6"   "7 4 5 6 7"

或者,如果我们只想打印它

for(i in seq_along(n))
 cat(c(n[i], if(n[i] < L[i]) 0 else if(n[i] == L[i]) n[i] else L[i]:n[i]), "\n")
#1 0 
#2 2 
#3 0 
#4 4 
#5 4 5 
#6 4 5 6 
#7 4 5 6 7 

答案 1 :(得分:1)

使用带有Reduce参数的accumulate = TRUE的方法,将结果作为结果

v1 <- ifelse(L > n, 0, ifelse(n == L, L, -1))
v1[v1 == -1] <- unique(unlist(Reduce(paste, x[v1==-1], y[v1==-1], accumulate = TRUE)))[-1]
#[1] "0"       "2"       "0"       "4"       "4 5"     "4 5 6"   "4 5 6 7"