5 списков в data.frame получают свое среднее значение, sd, удаленные выбросы

У меня есть data.frame из 5 списков

каждый список имеет 3 столбца:

T_C является индикатором TEST или CONTROL

идентификатор, T_C, SPEND

Я знаю, как использовать lapply для получения среднего значения T или C, но как это сделать с несколькими списками?

dfList <- lapply(tableListBase, function(t) fetch(dbSendQuery(con, paste0("SELECT * FROM ",  t))))

dfList <- setNames(dfList, tableListBase).

??

Для одного списка я могу это сделать?

means <- tapply(NET_SPEND, TC_INDICATOR, mean)

Я изучаю :-)

Моя цель получить среднее значение(), sd() по этим 5 спискам T/C на данный момент.

Моя конечная цель - определить: среднее - 3 sd() и среднее + 3 sd() и удалить их из этого набора из 6 списков и создать новый после удаления выбросов.

Я знаю, как это сделать в более формальном ручном режиме, больше кода строк, но хотел бы узнать, как использовать больше методов FUN() :-)


person Ray Kodiak    schedule 22.12.2016    source источник
comment
Как вы получили фрейм данных списков? Я искренне не знал, что ты так умеешь. Почему не список списков?   -  person TARehman    schedule 22.12.2016
comment
извините, это похоже на data.frame в R, но это просто список этих 6 запросов   -  person Ray Kodiak    schedule 22.12.2016
comment
Я думаю, у вас, вероятно, есть список фреймов данных.   -  person Benjamin    schedule 22.12.2016
comment
это самый раздражающий интерфейс, весь этот веб-сайт, который я когда-либо видел в своей жизни, кстати, очень раздражающий!   -  person Ray Kodiak    schedule 22.12.2016
comment
да, вы, наверное, правы, это список списков, 6 из них, когда я его просматриваю   -  person Ray Kodiak    schedule 22.12.2016


Ответы (1)


Вот несколько подходов, которые вы можете использовать. Я заказал их по тому, который я, скорее всего, использовал бы сам:

# Make a list of 5 data frames.  I'll use `mtcars` for convenience, since 
# I don't have your data.

X <- lapply(1:5,
            function(i) mtcars[sample(1:nrow(mtcars),
                                      size = nrow(mtcars), 
                                      replace = TRUE), ])

library(dplyr)

# Bring all of the tables together and summarise
mapply(function(df, i){ df$tbl_id <- i; df},
       X,
       seq_along(X),
       SIMPLIFY = FALSE) %>%
  bind_rows() %>%
  group_by(tbl_id, am) %>%
  summarise(mean = mean(mpg),
            sd = sd(mpg))

# Make a list of summaries
lapply(X,
       function(df) 
       {
         df %>%
           group_by(am) %>%
           summarise(mean = mean(mpg),
                     sd = sd(mpg))
       })


# Run tapply separately for the means and sds
mean_list <- 
  lapply(X,
         function(df)
         {
           tapply(df$mpg, df$am, mean)
         }
  )

sd_list <- 
  lapply(X,
         function(df)
         {
           tapply(df$mpg, df$am, sd)
         }
  )
person Benjamin    schedule 22.12.2016
comment
будет ли это работать в моем списке списков или это должен быть data.frame? - person Ray Kodiak; 22.12.2016
comment
Benajmin - вы правы, когда я использовал str(dfList), он сказал: Список из 6 - person Ray Kodiak; 22.12.2016
comment
Я предположил, что у вас есть список фреймов данных, потому что это, как правило, то, что вы получаете от dbSendQuery. Последний вариант будет работать для списка списков. Если у вас есть возможность создавать фреймы данных списков (все элементы имеют одинаковую длину), я бы рекомендовал это сделать. - person Benjamin; 22.12.2016
comment
Я не могу сказать, что понимаю, так как я учусь, что такое df, X ? - person Ray Kodiak; 22.12.2016
comment
X — это список фреймов данных. Когда я использую функцию apply для X, я определяю локальную функцию для работы с некоторым объектом df. Я выбрал df как сокращение от фрейма данных. Таким образом, в каждой функции применения df является заменой элемента списка X. - person Benjamin; 22.12.2016
comment
› str(dfList) Список из 6 $ Notes_Spend_201606:'data.frame': 64609 obs. из 3 переменных: $ Notes_Spend_201607:'data.frame': 100523 обс. из 3 переменных: $ Notes_Spend_201608:'data.frame': 62234 наб. из 3 переменных: $ Notes_Spend_201609:'data.frame': 57506 обс. из 3 переменных: $ Notes_Spend_201610:'data.frame': 59078 обс. из 3 переменных: $ Notes_Spend_201611:'data.frame': 55969 обс. из 3 переменных: - person Ray Kodiak; 22.12.2016
comment
Я пробовал это, я думаю, что он вычислил среднее значение и sd по всем 6 спискам? - person Ray Kodiak; 22.12.2016
comment
› mapply(function(df, i){ df$tbl_id ‹- i; df}, + dfList, + seq_along(dfList), + SIMPLIFY = FALSE) %›% + bind_rows() %›% + group_by(TC_INDICATOR) % ›% + суммировать(среднее = среднее(NET_SPEND), + sd = sd(NET_SPEND)) среднее sd 1 188,4113 696,2709 - person Ray Kodiak; 22.12.2016
comment
Вам нужно использовать group_by(tbl_id, TC_INDICATOR) - person Benjamin; 22.12.2016
comment
тот же ответ, когда я добавил это. Разве это не должно дать мне 6 ответов для среднего и 6 для sd? - person Ray Kodiak; 22.12.2016
comment
мне кажется, что этот stackoverflow был разработан, чтобы ускорить все, мне это действительно не нравится, Google не должен ранжировать их выше всего, я действительно ненавижу этот веб-сайт. - person Ray Kodiak; 23.12.2016