2013-06-17 4 views
2

У меня есть список из нескольких data.frames. Каждый data.frame имеет несколько столбцов. С помощью mean(mylist$first_dataframe$a Я могу получить среднее значение для a в этом одном data.frame. Однако я не знаю, как вычислить все кадры data.frames, хранящиеся в моем списке, или как для конкретных data.frames.Рассчитать, например, среднее в списке с несколькими столбцами data.frames

я мог бы использовать цикл, но мне сказали, что apply() и его вариация лучше я попытался использовать несколько решений, которые я нашел через поиск, но так или иначе он просто не работает. Я предполагаю, что мне нужно использовать

unlist() 

Не могли бы вы привести пример того, как вычислить, например, среднее значение для такой структуры данных, как моя. Список с несколькими data.frames, содержащими несколько столбцов.

Обновление: Прошу прощения за путаницу. Я хотел получить среднее значение для определенного столбца во всех файлах данных. Благодаря Томасу для предоставления рабочего решения для вычисления большого значения для определенного столбца во всех кадрах данных и для psychometriko для предоставления полезного решения для вычисления средств по всем столбцам во всех кадрах данных (& даже для случая, когда не используются числовые данные).

Спасибо!

+0

Кадры данных, составляющие компоненты вашего списка, имеют одинаковую структуру (т. Е. Одинаковое количество столбцов с одинаковыми именами и классами в каждом столбце - количество строк может отличаться)? – psychometriko

+0

@psychometriko У них точно такая же структура – Nikita

+0

@Thomas Последняя. Итак, у меня есть список. Этот список содержит много данных, которые имеют одинаковую структуру. Предположим, что в dataframe5 есть dataframe1, каждый из которых имеет столбцы «a», «b» и «c». Теперь я хочу грандиозное значение «a» для всех объединенных данных. – Nikita

ответ

4

Это вы что искали?

set.seed(42) 
mylist <- list(a=data.frame(foo=rnorm(10), 
          bar=rnorm(10)), 
       b=data.frame(foo=rnorm(10), 
          bar=rnorm(10)), 
       c=data.frame(foo=rnorm(10), 
          bar=rnorm(10))) 
sapply(do.call("rbind",mylist),mean) 

     foo  bar 
0.1163340 -0.1696556 

Примечание: do.call("rbind",mylist) возвращает что-то похожее на то, что вы упомянули выше с функцией unlist, а затем sapply, как об этом говорится Роландом в своем ответе, просто вызывает функцию mean каждого компонента (столбца) data.frame, что является результатом вышеуказанной функции do.call.

Редактировать: В ответ на вопрос о том, как иметь дело с нечисловых компонентами data.frame, ниже решение по общему признанию, не очень элегантно, и я уверен, что существуют лучшие из них, но вот первая вещь, которую я был в состоянии думать:

set.seed(42) 
mylist <- list(a=data.frame(rand=rnorm(10), 
          lets=sample(LETTERS,10,replace=TRUE)), 
       b=data.frame(rand=rnorm(10), 
          lets=sample(LETTERS,10,replace=TRUE)), 
       c=data.frame(rand=rnorm(10), 
          lets=sample(LETTERS,10,replace=TRUE))) 
sapply(do.call("rbind",mylist),function(x) { 
    if (is.numeric(x)) mean(x) 
}) 

$rand 
[1] -0.02470602 

$lets 
NULL 

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

+0

Да! Спасибо. Это то, что мне нужно, и ваш пример работает. Но как рассказать рассчитать только «foo» или «bar». При использовании этого кода для всего списка я получаю много предупреждений (не числовых) и странных результатов. – Nikita

+0

См. Мое редактирование выше. – psychometriko

+0

Это тоже работает, но это не главное значение для всех фреймов данных. В нем перечислены каждый фрейм данных и его значение для «foo»/«a». – Nikita

2

Вся вещь do.call('rbind', List) вещь может быть довольно медленной и подверженной неудачам. Если есть только один столбец вам необходимо среднее значение для, лучший способ:

mean(sapply(mylist, function(X) X$rand)) 

Это примерно в 10 раз быстрее do.call метод.

+0

Что делать, если имя столбца также является аргументом для пользователя? – Tanny

Смежные вопросы