У меня есть цикл, который будет выдавать кучу фреймов данных, и я хочу назвать фреймы данных на основе текущей итерации цикла, например. df1
для первой итерации, df2
для второй итерации и так далее.
Однако я сталкиваюсь с проблемами, пытаясь использовать счетчик итераций цикла для создания имени фрейма данных. Например, представим, что я нахожусь на первой итерации цикла и хочу назвать фрейм данных:
counter <- 1
as.name(paste("df",counter,sep="")) <- data.frame(x = (1:10), y = (10:1))
Я получаю ошибку
Error in as.name(paste("df", counter, sep = "")) <- data.frame(x = (1:10), :
target of assignment expands to non-language object
Кто-нибудь знает, как я могу использовать информацию счетчика для создания имен фреймов данных?
4 ответа
Используйте assign
:
assign(paste0("df", counter), data.frame(x = (1:10), y = (10:1))
Это сделано для того, чтобы дополнить книгу Ричарда, поскольку она казалась слишком существенной, чтобы просто отредактировать его.
Типичный образец кода для такого рода вещей:
#Initialize an empty list of the desired length
dfs <- vector("list",3)
#Fill the list with data frames, naming as we go
for (i in seq_along(dfs)){
dfs[[i]] <- data.frame(x = runif(5),y = runif(5))
names(dfs)[[i]] <- paste0("df",i)
}
Где использование assign
обычно не одобряется как плохое (стилистически). Если именование фреймов данных очень регулярное, вам даже не нужно делать это в цикле:
names(dfs) <- paste0("df",seq_along(dfs))
Вы можете сделать это в векторизованном виде, как указано выше. И, как я уже упоминал ниже, ответ Ричарда, хотя наличие их всех в списке никогда не бывает хуже и, как правило, лучше, чем иметь их как отдельные объекты, вы можете преобразовать список в отдельные объекты с помощью:
list2env(dfs,envir = .GlobalEnv)
Вместо того, чтобы загромождать глобальную среду фреймами данных, было бы лучше собрать их в list
, а затем вы можете использовать paste0
, чтобы назвать их в setNames
, например,
> dfList <- setNames(list(data.frame(x = 1:10, y = 10:1)), paste0("df", 1))
После этого вы можете обратиться к фрейму данных с помощью
> dfList$df1
x y
1 1 10
2 2 9
3 3 8
4 4 7
5 5 6
6 6 5
7 7 4
8 8 3
9 9 2
10 10 1
Как отмечает Джоран, если вы настаиваете на заполнении глобальной среды этими фреймами данных, вы можете использовать
list2Env(dfList, envir = .GlobalEnv)
И фреймы данных будут назначены как объекты в глобальной среде.
list2env(dfList,envir = .GlobalEnv)
, если это необходимо.
Я думаю ты ищешь
assign("name", dataframe)
Похожие вопросы
Новые вопросы
r
R — это бесплатный язык программирования с открытым исходным кодом и программная среда для статистических вычислений, биоинформатики, визуализации и общих вычислений. Пожалуйста, используйте минимально воспроизводимые примеры, которые другие могут запустить с помощью копирования и вставки. Показать желаемый результат. Используйте dput() для данных и укажите все небазовые пакеты с помощью library(). Не вставляйте изображения для данных или кода, вместо этого используйте блоки кода с отступом. Для вопросов по статистике используйте https://stats.stackexchange.com.