Зацикливаться на ls() или objects()?
Могу ли я в любом случае пройтись по некоторому набору объектов и применить функцию к каждому из них?
Когда я печатаю ls()
или же objects()
, он возвращает список имен объектов. Я хотел бы перебрать этот список, определить те, которые data.frame
, а затем запустить функцию против каждого объекта.
Как мне пройти запись от ls
или же objects
через функцию?
Извинения, если это кажется глупым вопросом...
6 ответов
Ответ @jverzani о том, какие объекты являются фреймами данных, хорош. Итак, начнем с этого. Но мы хотим выбрать только те элементы, которые являются фреймами данных. Таким образом, мы могли бы сделать это следующим образом:
#test data
df <- data.frame(a=1:10, b=11:20)
df2 <- data.frame(a=2:4, b=4:6)
notDf <- 1
dfs <- ls()[sapply(mget(ls(), .GlobalEnv), is.data.frame)]
имена фреймов данных теперь являются строками в объекте dfs, поэтому вы можете передавать их другим функциям, например так:
sapply( dfs, function(x) str( get( x ) ) )
Я использовал get()
команда для фактического получения объекта по имени (подробнее об этом см. R FAQ)
Я ответил на ваши вопросы выше, но у меня есть подозрение, что если бы вы организовали свои фреймы данных в элементы списка, ваш код был бы НАМНОГО более читабельным и простым в обслуживании. Очевидно, что я не могу сказать это с уверенностью, но я не могу придумать случай использования, когда перебор всех объектов в поисках фреймов данных лучше, чем хранение ваших фреймов данных в списке, а затем вызов каждого элемента в этом списке.
Вы можете получить объект по его имени с помощью get или mget и выполнить итерацию с помощью одной из функций apply type. Например,
sapply(mget(ls(), .GlobalEnv), is.data.frame)
скажет вам, какие элементы в глобальной среде являются фреймами данных. Для использования внутри функции вы можете указать среду для вызова ls.
Вбрасывание другого раствора в смесь с помощью inherits
, Он в основном (а) получает все объекты из текущей среды и (б) проверяет, наследуются ли они от фрейма данных.
sapply(sapply(ls(), get), inherits, 'data.frame')
Вы можете использовать функцию get()
ссылаться на объект по имени
# Create some objects
df <- data.frame(a=1:10)
dl <- list(a=1, b=2, c=3)
# Use `ls()` to return a list of object names
lso <- ls()
# Use `get()` to refer to specific objects
class(get(lso[1]))
[1] "data.frame"
# Using an apply function to evaluate the class
lapply(lso, function(x) class(get(x)))
[[1]]
[1] "data.frame"
[[2]]
[1] "list"
Вы можете использоватьFilter
сis.data.frame
иls
вmget
чтобы получить именованный список в этом случаеdata.frame
объекты.
Этотlist
затем можно использовать, например, вlapply
чтобы применить каждый элемент списка к функции.
L <- Filter(is.data.frame, mget(ls()))
lapply(L, nrow)