2016-06-23 2 views
0

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

Скажем, у меня есть куча разных данных:

mtcars1, mtcars2, mtcars3 ..... mtcars20. Каждый из них будет иметь разные уровни факторов, например, столбцы CYL. Я хочу, чтобы запустить функцию, которая:

  1. возвращает значение CYL ряда от фактора - as.numeric (as.character())
  2. вычисляет некоторые новый столбец, переходящее в среднем миль на галлон.

Теперь, каков код для этого и примените эту функцию? Опять же, я хочу, чтобы на выходе были все кадры данных mtcars1 ... mtcars20.

Я пытался смотреть на

lapply(mylist=c(mtars1...mtcars20) function(x) myfunct()) 

, но я бегу в неприятности.

+0

Это крайне необходимо, чтобы быть список data.frames. Не 'lapply (список (mtcars1, mtcars2, ...), myfunct)' работает? – r2evans

+0

Я пробовал это, но, возможно, мой синтаксис был неправильным. Для простого примера притвориться, что моя функция просто хочет преобразовать столбец CYL из значения коэффициента в числовой. Как мне это сделать? Я потратил некоторое время на борьбу с этим, и я не мог заставить его работать, поэтому я подумал, что есть какой-то другой способ, или у меня был неправильный подход? – runningbirds

+0

См. Следующее сообщение о [работе со списками data.frames] (http://stackoverflow.com/questions/17499013/how-do-i-make-a-list-of-data-frames). Ответом gregor есть много хороших советов о том, как работать с такими объектами. Некоторые из других методов сообщений помещают data.frames в списки. – lmo

ответ

0
## generate data 
for (i in 1:5) assign(paste0('mtcars',i),transform(mtcars,cyl=factor(cyl+10^i))); 

## collect loose data.frames into one list, and remove the originals 
nms <- ls(pattern='^mtcars\\d+$'); 
dfs <- mget(nms); 
rm(list=nms); 

## solution 
library(zoo); ## for rollmean() 
for (i in seq_along(dfs)) { 
    dfs[[i]]$cyl <- as.numeric(as.character(dfs[[i]]$cyl)); 
    dfs[[i]]$some.new.column <- rollmean(dfs[[i]]$mpg,5L,fill=NA); 
}; ## end for 
0

Можно еще использовать функцию lapply() возвращает список фреймов данных:

dfs <- rep(list(mtcars), 4) #list of data frames 

dfs <- lapply(dfs, function(x) { 
       names(x)[1] <- "m_p_g" 
       x}) 
lapply(dfs, head, 2) 
# [[1]] 
#    m_p_g cyl disp hp drat wt qsec vs am gear carb 
# Mazda RX4  21 6 160 110 3.9 2.620 16.46 0 1 4 4 
# Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4 

# [[2]] 
#    m_p_g cyl disp hp drat wt qsec vs am gear carb 
# Mazda RX4  21 6 160 110 3.9 2.620 16.46 0 1 4 4 
# Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4 

# [[3]] 
#    m_p_g cyl disp hp drat wt qsec vs am gear carb 
# Mazda RX4  21 6 160 110 3.9 2.620 16.46 0 1 4 4 
# Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4 

# [[4]] 
#    m_p_g cyl disp hp drat wt qsec vs am gear carb 
# Mazda RX4  21 6 160 110 3.9 2.620 16.46 0 1 4 4 
# Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4