Зацикливаться на ls () или objects ()? - PullRequest
17 голосов
/ 27 апреля 2011

Могу ли я в любом случае пройтись по некоторому набору объектов и применить функцию к каждому из них?

Когда я набираю ls() или objects(), он возвращает список имен объектов.Я мог бы перебрать этот список, определить те из них, которые data.frame, а затем запустить функцию для каждого объекта.

Как передать запись из ls или objects через функцию?

Извиняюсь, если это кажется глупым вопросом ...

Ответы [ 5 ]

17 голосов
/ 27 апреля 2011

Ответ @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 )

Я отвечал на ваши вопросы выше, но у меня есть подозрение, что если бы вы организовали ваши фреймы данных в элементы списка, ваш код был бы НАМНОГО более читабельным и простым в обслуживании. Очевидно, что я не могу сказать это с уверенностью, но я не могу придумать случай использования, в котором перебор всех объектов в поисках фреймов данных лучше, чем сохранение ваших фреймов данных в списке, а затем вызов каждого элемента в этом списке.

11 голосов
/ 27 апреля 2011

Вы можете получить объект по его имени с помощью get или mget и выполнить итерацию с помощью одной из функций применения типа.Например,

sapply(mget(ls(), .GlobalEnv), is.data.frame)

сообщит вам, какие элементы в глобальной среде являются фреймами данных.Для использования внутри функции вы можете указать среду для вызова ls.

5 голосов
/ 27 апреля 2011

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

2 голосов
/ 27 апреля 2011

Вбрасывание другого раствора в смесь с использованием inherits.В основном (а) получает все объекты из текущей среды и (б) проверяет, наследуются ли они от фрейма данных.

sapply(sapply(ls(), get), inherits, 'data.frame')
1 голос
/ 27 апреля 2011

Вы можете использовать функцию 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...