Подтвердить что ты не робот

Создание кортежей из двух векторов

Если у меня есть два вектора с одинаковой длиной A<-c(5,10) и B<-c(7,13), как я могу легко превратить эти два вектора в один вектор набора i. е. c((5,7),(7,13))?

4b9b3361

Ответ 1

Другие упомянули списки. Я вижу другие возможности:

cbind(A, B)  # makes a column-major  2x2-"vector"
rbind(A, B)  # an row major 2x2-"vector" which could also be added to an array with `abind`

Можно сохранить свои "истоки"

AB <- cbind(A=A, B=B)
array(c(AB,AB+10), c(2,2,2) )
, , 1
     [,1] [,2]
[1,]    5    7
[2,]   10   13
, , 2
     [,1] [,2]
[1,]   15   17
[2,]   20   23

> abind( array(c(AB,AB+10), c(2,2,2) ), AB+20)
, , 1
      A  B
[1,]  5  7
[2,] 10 13

, , 2
      A  B
[1,] 15 17
[2,] 20 23

, , 3
      A  B
[1,] 25 27
[2,] 30 33

Ответ 2

Ваш кортеж c((5,7),(7,13)) недействителен. Однако ваша фраза заставляет меня думать, что вы думаете о чем-то вроде python zip. Как вы хотите, чтобы ваши кортежи представлялись в R? R имеет гетерогенный (рекурсивный) тип list и гомогенный тип vector; нет скалярных типов (т.е. типов, которые просто содержат единственное значение), просто векторы длины 1 (несколько упрощенное).

Если вы хотите, чтобы ваши кортежи были строками матрицы (все те же типы, которые они здесь):

rbind(A,B)

Если вам нужен список векторов

mapply(c, A, B, SIMPLIFY=FALSE)

Если вам нужен список списков (это то, что вам нужно, если A и B не совпадают)

mapply(list, A, B, SIMPLIFY=FALSE)

Объединяя все это:

> A<-c(5,10)
> B<-c(7,13)
> 
> cbind(A,B)
      A  B
[1,]  5  7
[2,] 10 13
> mapply(c, A, B, SIMPLIFY=FALSE)
[[1]]
[1] 5 7

[[2]]
[1] 10 13

> mapply(list, A, B, SIMPLIFY=FALSE)
[[1]]
[[1]][[1]]
[1] 5

[[1]][[2]]
[1] 7


[[2]]
[[2]][[1]]
[1] 10

[[2]][[2]]
[1] 13

Ответ 3

Я не уверен, что это именно то, что вы ищете, но:

list(A, B)

который дает вам такую ​​структуру:

> str(list(A, B))
List of 2
 $ : num [1:2] 5 10
 $ : num [1:2] 7 13

и буквально представлен следующим образом:

dput (список (A, B)) список (c (5, 10), c (7, 13))

... Я думаю, что это примерно так же близко к предлагаемому конечному результату, как вы можете получить.

Список в R по существу является вектором того, что вы хотите.

Если это не то, что вы ищете, может быть полезно, если бы вы могли расширить то, что именно вы хотели бы сделать с этим вектором.

Ответ 4

Я вижу, чего вы хотите достичь (потому что у меня была такая же проблема)!

Почему бы не использовать сложные числа, потому что они в основном представляют собой ничего, кроме двухмерных чисел, и они являются официальным типом данных в R со всеми необходимыми доступными способами:

A <- complex(real=5,imaginary=10) 
B <- complex(real=7,imaginary=13)

c(A,B)
## [1] 5+10i 7+13i

matrix(c(A,B),ncol=1)
##       [,1]
## [1,] 5+10i
## [2,] 7+13i