Создание кортежей из двух векторов - PullRequest
20 голосов
/ 18 октября 2011

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

Ответы [ 4 ]

16 голосов
/ 18 октября 2011

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

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
9 голосов
/ 18 октября 2011

Ваш кортежный вектор c((5,7),(7,13)) не является допустимым синтаксисом. Тем не менее, ваша фраза заставляет меня думать, что вы думаете о чем-то вроде zip Python. Как вы хотите, чтобы ваши кортежи были представлены в 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
4 голосов
/ 18 октября 2011

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

list(A, B)

, которая дает вам такую ​​структуру:

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

и буквально представляется так:

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

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

Список в R - это, по сути, вектор того, чем вы хотите его видеть.

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

1 голос
/ 22 октября 2015

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

Почему бы не использовать комплексные числа, потому что они в основном не что иное, как двумерные числа, и они являются официальным типом данных в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...