Я пытаюсь сделать две вещи. Во-первых, если у меня есть вектор 1:5
, я хочу получить матрицу (или два вектора), указывающую уникальные комбинации этих элементов, включающие дважды одинаковое число, но исключая повторы.
Прямо сейчас я могу сделать это, используя матрицу:
foo <- matrix(1:5,5,5)
cbind(foo[upper.tri(foo,diag=TRUE)],foo[lower.tri(foo,diag=TRUE)])
[,1] [,2]
[1,] 1 1
[2,] 1 2
[3,] 2 3
[4,] 1 4
[5,] 2 5
[6,] 3 2
[7,] 1 3
[8,] 2 4
[9,] 3 5
[10,] 4 3
[11,] 1 4
[12,] 2 5
[13,] 3 4
[14,] 4 5
[15,] 5 5
Но должен быть более простой способ. Я пытался использовать Vectorize
на seq
, но это выдает ошибку:
cbind(Vectorize(seq,"from")(1:5,5),Vectorize(seq,"to")(5,1:5))
Error in Vectorize(seq, "from") :
must specify formal argument names to vectorize
Второе, что я хочу сделать, - это если у меня есть список, содержащий векторы, bar
, чтобы получить вектор, содержащий повторяющиеся элементы списка, равные количеству элементов в этом элементе. Я могу сделать это с:
unlist(apply(rbind(1:length(bar),sapply(bar,length)),2,function(x)rep(x[1],x[2])))
[1] 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3
Но опять же, должен быть более легкий путь. Я попытался Vectorize
снова здесь, но с той же ошибкой:
Vectorize(rep,"each")(1:length(bar),each=sapply(bar,length))
in Vectorize(rep, "each") :
must specify formal argument names to vectorize