2017-01-20 4 views
0

У меня есть некоторое понимание того, как использовать lapply, чтобы, скажем, изменить имена переменных в нескольких кадрах данных в списке. Тем не менее, я ищу немного (но только немного) более сложную операцию.Цитирование или привязка к списку данных в R

В частности, я хочу рассчитать средние темпы роста для нескольких объектов. Темпы роста уже вычислены, так что я просто нужен perfor следующих операций на всех dataframes

for (i in 1:13) { 
    growth.type[,i] <- tapply(growth[,8+i] , growth$type, mean, na.rm = TRUE) 
} 

Это создает новый dataframe (growth.type), который включает в себя среднее всех нескольких сот темпов роста в исходном dataframe (growth), type.

Теперь я хотел бы сделать это с несколькими кадрами данных (например, growth) и поместить их в новые dataframes (например, growth.type).

Надеюсь, это имеет смысл.

ответ

1

Поместите все data.frames вы хотите обработать в списке

xy <- list(growth1, growth2, growth3, ...) 

, а затем применить пользовательскую функцию к этому xy объекта.

customFunction <- function(.data) { 
    for (i in 1:13) { 
    growth.type[,i] <- tapply(.data[,8+i] , .data$type, mean, na.rm = TRUE) 
    } 
    growth.type # this is the object which will be returned when function finishes 
} 

тогда вобще

out <- lapply(xy, FUN = customFunction) 

Если вы хотите совместить результат из lapply, вы можете использовать do.call, например, do.call("rbind", out).

+0

Большое спасибо за ответ. Я предполагаю, что вы намекаете на последнее предложение, так это то, как хранить данные. Не могли бы вы немного рассказать о том, как это сделать? Когда я делаю 'out <- lapply (xy, FUN = customFunction)' Я получаю список пустых фреймов данных, даже несмотря на то, что функция работает отлично только на одном блоке данных. – pApaAPPApapapa

+0

@pApaAPPApapapa Самый простой способ - иметь воспроизводимый пример. Если вы не можете его предоставить, попробуйте положить 'browser()' непосредственно перед последней строкой 'growth.type'. Выполнение остановится там, и вы можете проверить объекты. Чтобы запустить код для следующего элемента, введите 'c' (продолжить) в консоль. Для запуска только одной строки нажмите ввод или введите «n» (далее). –