Зацикливаться на 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.

Вы можете перебирать объекты в среде, используя "eapply".

Вбрасывание другого раствора в смесь с помощью 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)
Другие вопросы по тегам