Выполнение линейной регрессии для нескольких файлов в R - PullRequest
1 голос
/ 17 марта 2012

У меня есть папка с 20 текстовыми файлами из нескольких инструментальных прогонов. Все разделы данных имеют один и тот же формат, как этот

22/05/11;   16:03:28;       0.000;   6.079;   31.41;   84881;   25.60; E0;
22/05/11;   16:03:29;       0.017;   6.063;   31.44;   84868;   25.60; E0;
22/05/11;   16:03:30;       0.034;   6.079;   31.41;   84868;   25.60; E0;
22/05/11;   16:03:31;       0.051;   6.079;   31.41;   84868;   25.60; E0;
22/05/11;   16:03:32;       0.068;   6.068;   31.43;   84868;   25.60; E0;
22/05/11;   16:03:33;       0.085;   6.068;   31.43;   84881;   25.60; E0;
22/05/11;   16:03:34;       0.102;   6.079;   31.41;   84874;   25.60; E0;

Что я хотел бы сделать, так это прочитать каждый файл в моей папке, выполнить линейную регрессию и вывести значение наклона и значение R2.

На данный момент это мой код для выполнения этого для одного файла.

O2=read.table("Coral 1_Dark.txt",skip=58, sep=";",header=FALSE)
names(O2)<-c("Date","Time","Log_Time","O2_mgL","Phase","Amp","Temp C","Error Message")
O2$id<-seq_len(nrow(O2)) #creates unique ID for each measurement (use for regression)
attach(O2)
fit=lm(O2_mgL~id)
summary(fit)

После запуска этого кода я вручную вводил наклон и данные R2.

На данный момент я могу создать переменную, которая содержит все интересующие меня файлы с

F=list.files()

Что дает мне все 20 файлов

[1] "Coral 1_Dark.txt"   "Coral 1_Light.txt"  "Coral 10_Dark.txt"  "Coral 10_Light.txt" "Coral   2_Dark.txt"  
[6] "Coral 2_Light.txt"  "Coral 3_Dark.txt"   "Coral 3_Light.txt"  "Coral 4_Dark.txt"   "Coral  4_Light.txt" 
[11] "Coral 5_Dark.txt"   "Coral 5_Light.txt"  "Coral 6_Dark.txt"   "Coral 6_Light.txt"  "Coral 7_Dark.txt"  
[16] "Coral 7_Light.txt"  "Coral 8_Dark.txt"   "Coral 8_Light.txt"  "Coral 9_Dark.txt"   "Coral 9_Light.txt" 

И то, что я хотел бы закончить, было бы примерно так для всех 20 файлов

Coral            Slope        R2
Coral 1_Dark      0.23         98.3
Coral 2_Dark      0.33         99.3

1020 * ЭСТ *

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

Ответы [ 3 ]

3 голосов
/ 17 марта 2012

Как то так?

wd <- "C:/Data"
files    <- dir(wd)
varnames <- c("Date", "Time", "Log_Time", "O2_mgL", "Phase", "Amp", "Temp C",
            "Error Message")
results  <- data.frame()

for (i in 1:length(files)) {
  fname <- paste(wd, files[i], sep="/")
  data <- read.table(fname, sep=";", skip=58)
  colnames(data) <- varnames
  data$id <- 1:nrow(data)
  fit <- summary(lm(O2_mgL~id, data=data))
  results[i,1] <- fit$coefficients[2]
  results[i,2] <- fit$r.squared
}

rownames(results) <- sub(".txt", "", files)
colnames(results) <- c("Slope", "R2")

print(results)
1 голос
/ 17 марта 2012

У этого кода может быть шанс. Не рекомендуется использовать attach, но особенно при создании функций.

Coral_1_Dark.txt <- "22/05/11;   16:03:28;       0.000;   6.079;   31.41;   84881;   25.60; E0;
+ 22/05/11;   16:03:29;       0.017;   6.063;   31.44;   84868;   25.60; E0;
+ 22/05/11;   16:03:30;       0.034;   6.079;   31.41;   84868;   25.60; E0;
+ 22/05/11;   16:03:31;       0.051;   6.079;   31.41;   84868;   25.60; E0;
+ 22/05/11;   16:03:32;       0.068;   6.068;   31.43;   84868;   25.60; E0;
+ 22/05/11;   16:03:33;       0.085;   6.068;   31.43;   84881;   25.60; E0;
+ 22/05/11;   16:03:34;       0.102;   6.079;   31.41;   84874;   25.60; E0;

list_of_summaries <- sapply( 'Coral_1_Dark.txt', function(nam) { 
    O2 <- read.table(file=textConnection(get(nam)), sep=";",header=FALSE)
    names(O2) <- c("Date","Time","Log_Time","O2_mgL","Phase", 
                               "Amp","Temp C","Error Message", "junk")
    O2$id <- seq_len( nrow(O2) )
    fit=lm(O2_mgL~id , data=O2)
    summ <- summary(fit) 
    return( c(slope= coef(fit)["id"], R2= summ[["r.squared"]] ) )  })

as.data.frame( list_of_summaries )
0 голосов
/ 17 марта 2012

Да, вы собираетесь получить представление о применяемых функциях. В основном, сделайте dir() вызов для папки, затем оберните все, что вы сделали в функции, одним аргументом файла. и вернуть результаты, которые вас интересуют. Затем вызовите lapply в списке файлов с функцией в качестве второго аргумента

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...