С помощью R обведите фреймы данных и назначьте соответствующие имена объектам, созданным в цикле. - PullRequest
8 голосов
/ 27 мая 2011

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

Представьте, что в рабочем каталоге есть 5 *.csv файлов с именем dat1.csv, dat2.csv, ... * 1006.*.Я хочу оценить ту же линейную модель, используя каждый набор данных.

Учитывая этот ответ , первым шагом является сбор списка файлов, который я делаю со следующим

csvdat <- list.files(pattern="dat.*csv")

Теперь я хочу сделать что-то вроде

for(x in csvdat) {
    lm.which(csvdat == "x") <- lm(y ~ x1 + x2, data = x)
}

Оператор «which» - это мой глупый способ попытаться поочередно пронумеровать каждую модель, используя расположение в списке csvdat, до которого доходит цикл.то есть, я бы хотел, чтобы этот цикл возвращал набор объектов объемом 5 лм с именами lm.1, lm.2 и т. д.

. Есть ли какой-нибудь простой способ создания этих объектов, и назовите их так, чтобыЯ легко могу указать, какому набору данных они соответствуют?

Спасибо за вашу помощь!

Ответы [ 3 ]

10 голосов
/ 27 мая 2011

Используйте список для хранения результатов ваших регрессионных моделей, например,

foo <- function(n) return(transform(X <- as.data.frame(replicate(2, rnorm(n))), 
                                                       y = V1+V2+rnorm(n)))
write.csv(foo(10), file="dat1.csv")
write.csv(foo(10), file="dat2.csv")
csvdat <- list.files(pattern="dat.*csv")
lm.res <- list()
for (i in seq(along=csvdat))
  lm.res[[i]] <- lm(y ~ ., data=read.csv(csvdat[i]))
names(lm.res) <- csvdat
10 голосов
/ 27 мая 2011

Другой подход заключается в использовании пакета plyr для выполнения цикла.Используя пример, построенный @chl, вот как вы это сделаете

require(plyr)

# read csv files into list of data frames
data_frames = llply(csvdat, read.csv)

# run regression models on each data frame
regressions = llply(data_frames, lm, formula = y ~ .)
names(regressions) = csvdat
8 голосов
/ 27 мая 2011

что вы хотите, это комбинация функций seq_along() и assign()

seq_along помогает создать вектор от 1 до 5, если в csvdat есть пять объектов (чтобы получить соответствующие числа, а не только имена переменных). Затем assign (используя paste для создания подходящих последовательностей из чисел) позволяет создать переменную.

Обратите внимание, что вам также необходимо сначала загрузить файл данных (в вашем примере он отсутствовал):

for (x in seq_along(csvdat)) {
    data.in <- read.csv(csvdat[x])   #be sure to change this to read.table if necessary
    assign(paste("lm.", x, sep = ""), lm(y ~ x1 + x2, data = data.in))
}

seq_along не является абсолютно необходимым, могут быть другие способы решения проблемы нумерации.

Критическая функция assign. С помощью assign вы можете создавать переменные с именем на основе строки. См. ?assign для получения дополнительной информации.


После комментариев chl (см. Его пост) все в одной строке:

for (x in seq_along(csvdat)) assign(paste("lm", x, sep = "."), lm(y ~ x1 + x2, data = read.csv(csvdat[x]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...