Заполнить вектор значением, чтобы длина подходила? - PullRequest
0 голосов
/ 30 мая 2018

Мне интересно, есть ли какая-нибудь примитивная функция в R, которая делает то же самое, что и foo:

foo <- function(a, b) {
  makeSmallerVectAsLonger <- function(smaller, longer) {
    lengthDiff <- length(longer) - length(smaller)
    c(smaller, rep(0, lengthDiff))
  }
  lengthA <- length(a)
  lengthB <- length(b)
  if(lengthA  > lengthB) {
    b <- makeSmallerVectAsLonger(b, a) 
  }
  if(lengthA  < lengthB) {
    a <- makeSmallerVectAsLonger(a, b)
  }
  list(a, b)
} 

, поэтому, когда я запускаю foo(1:9, 1:5), я должен получить список из 2 векторов:
1-й:
1, 2, 3, 4, 5, 6, 7, 8, 9
2-й:
1, 2, 3, 4, 5, 0, 0, 0, 0

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Я не думаю, что есть, но вы можете немного упростить свою функцию:

expand_vecs <- function(a,b)
{
    base <- numeric(max(length(a),length(b)))
    lapply(list(a,b), function(x) replace(base,seq_along(x),x))
}

expand_vecs(1:9, 1:5)
[[1]]
[1] 1 2 3 4 5 6 7 8 9

[[2]]
[1] 1 2 3 4 5 0 0 0 0

Это можно довольно легко расширить, чтобы принять произвольное количество входов:

expand_vecs <- function(..., default=0)
{
    vecs <- list(...)
    base_length <- max(sapply(vecs,length))
    base <- rep(default,base_length)
    lapply(vecs, function(x) replace(base,seq_along(x),x))
}

expand_vecs(rnorm(5),sample(1:10,3),3)
[[1]]
[1] -1.7961210 -0.2844418 -1.1059407 -0.6908350 -0.7752376

[[2]]
[1]  9 10  8  0  0

[[3]]
[1] 3 0 0 0 0
0 голосов
/ 30 мая 2018

Ближайший вариант, который я могу придумать, - использовать функцию qpcR:::cbind.na.Ответ в случае векторов ОП:

qpcR:::cbind.na(1:9, 1:5)
#      [,1] [,2]
# [1,]    1    1
# [2,]    2    2
# [3,]    3    3
# [4,]    4    4
# [5,]    5    5
# [6,]    6   NA
# [7,]    7   NA
# [8,]    8   NA
# [9,]    9   NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...