Объедините большие числовые векторы в кадр данных с помощью цикла (R) - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь узнать, как правильно объединить ~ 50 числовых векторов (каждый вектор имеет ~ 20 тыс. Элементов) в цикле данных через цикл.

Эти векторы имеют одинаковые имена в одинаковом порядке, но разные значения. Они выглядят так:

#Vector 1
v1 = c(1, 20, 3, 2, 50)
names(v1) = c(geneA, geneB, geneC, geneD, geneE)

#Vector 2
v2 = c(25, 12, 43, 0, 50)
names(v2) = c(geneA, geneB, geneC, geneD, geneE)

#... total 50 vectors like these

Мне бы хотелось иметь итоговую таблицу после того, как цикл будет выглядеть (не стесняйтесь менять имена строк):

          geneA   geneB   geneC   geneD   geneE
values_v1   1      20       3       2      50
values_v2   25     12       43      0      50
...
values_v50...

Следует отметить, что числовые векторы являются выходными данными определенной библиотеки, поэтому я не могу с ними что-то сделать. Моя текущая логика цикла состоит в том, чтобы начинать с list () и добавлять фрейм данных один за другим. В конце:

Reduce(function(...) merge(...), listDataFrames)

Я не уверен, что это лучший способ сделать это. Если это разумно, не могли бы вы также указать, как объединить имена векторов в приведенной выше команде? Большое спасибо и с наступающим Новым годом.

1 Ответ

0 голосов
/ 03 января 2019

Одним из способов было бы использование do.call с rbind

do.call(rbind, mget(ls(pattern = "^v")))

#   geneA geneB geneC geneD geneE
#v1     1    20     3     2    50
#v2    25    12    43     0    50

Вместо того, чтобы вручную вводить 50 векторов вручную, мы можем выяснить, существует ли шаблон в их соглашении об именах.Судя по предоставленным данным, вектор имеет имена v1, v2, v3 и так далее.Таким образом, используя команду ls, мы получаем все такие объекты, которые начинаются с v.Он вернет список таких объектов.

mget(ls(pattern = "^v"))
#$v1
#geneA geneB geneC geneD geneE 
#    1    20     3     2    50 

#$v2
#geneA geneB geneC geneD geneE 
#   25    12    43     0    50 

и теперь мы rbind все такие объекты вместе.Поскольку векторы следуют в том же порядке имен, это не должно быть проблемой.


Использование той же логики с Reduce также будет работать

Reduce(rbind, mget(ls(pattern = "^v")))
...