Объединение R векторов на основе их имени

#r

#r

Вопрос:

У меня есть много R векторов, названных так: gna.0 и gna.1 , также gni.0 и gni.1 , и так далее

Я хочу создать новые векторы, подобные этому:

 gna <- c(gna.0, gna.1)
gni <- c(gni.0, gni.1)
  

и так далее

Вы можете помочь ?!

Спасибо!

Комментарии:

1. Что вы подразумеваете под «названным так»? Какой шаблон? Всегда ли gn другая буква .0 или .1 или также может измениться gn ?

Ответ №1:

Используется ls для поиска переменных и mget получения их значения.

 gna.0 <- 1:3
gna.1 <- 4:6
gni.0 <- 7:9
gni.1 <- 10:11

gna <- unlist(mget(ls(pattern = "gna.*")), use.names = FALSE)
gna
#> [1] 1 2 3 4 5 6

gni <- unlist(mget(ls(pattern = "gni.*")), use.names = FALSE)
gni
#> [1]  7  8  9  10 11
  

Комментарии:

1. Спасибо! У меня много файлов, и я хотел бы создать цикл, в котором все файлы начинаются с «gn». Вы можете помочь?

2. Пожалуйста. Если вы зададите еще один вопрос, я посмотрю.

Ответ №2:

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

 #Get all unique group names like gna, gni etc
groups <- unique(sub('\..*', '', ls(pattern = 'gn')))

#Create a named vector with all the group vectors together
result <- sapply(groups, function(x) 
   unlist(mget(ls(pattern = paste0('\b', x, '\b'),.GlobalEnv), 
          .GlobalEnv), use.names = FALSE), simplify = FALSE)

#Write the new vector to global environment
list2env(result, .GlobalEnv)
#New object gna, gni are created in global environment
  

Комментарии:

1. Это хороший способ сделать это, но это создает список с большим количеством gn внутри. Что я могу сделать для создания нового вектора вместо списка?

2. Вы хотите удалить имена из каждого вектора? Смотрите Обновленный ответ, если это поможет.

3. Это лучше, но у меня есть проблема. Поскольку, например, в возвращаемом векторе gna1 у меня есть данные из gna1, а также из gna10, gna11 и т.д…

4. Мы можем добавить границы слов вокруг шаблона. Смотрите обновленный ответ.

Ответ №3:

Работает ли это:

 > gna.0 = c(1,2)
> gna.1 = c(3,4)
> gni.0 = c(5,5)
> gni.1 = c(6,6)
> 
> 
> gna = do.call('c', mget(grep("gna",names(.GlobalEnv),value=TRUE)))
> gni = do.call('c', mget(grep("gni",names(.GlobalEnv),value=TRUE)))
> gna
gna.01 gna.02 gna.11 gna.12 
     1      2      3      4 
> gni
gni.01 gni.02 gni.11 gni.12 
     5      5      6      6 
  

Комментарии:

1. Спасибо за ваш ответ, но это не то, что я хочу. У меня много файлов с именами, начинающимися на «gn», и для каждого у меня есть суффикс .0 и . 1. Я хочу сделать gna <- c(gna.0, gna.1), используя цикл, где gna — это имя всех моих файлов, соответствующих скороговорке «gn *».