#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 *».