2013-03-13 2 views
1

У меня есть три текстовых файла. Я хочу сделать некоторые вычисления, как показано ниже, и построить результаты. Все текстовые файлы содержат 14 столбцов от X1 до X14 и 601 строк. Этот код в основном читает X3 из всех трех файлов и выполняет некоторые вычисления, а затем возвращает результат.Как перебрать текстовые файлы в R?

ref= read.table("D:\\ref.txt", sep="",header=TRUE)# read first file 
    sour1 = read.table("D:\\sour1.txt", sep="",header=TRUE)# read second file 
    sour2= read.table("D:\\sour2.txt", sep="",header=TRUE,na.rm=TRUE)# read third file 
    result1 = (mean(ref$X3) - ((sd(ref$X3)/sd(sour1$X3))*mean(sour1$X3))+ ((sd(ref$X3)/sd(sour1$X3)*sour1$X3))) # calculate using ref and sour1 
result2 = ((mean(ref$X3) - ((sd(ref$X3)/sd(sour2$X3,na.rm=TRUE))*mean(sour2$X3,na.rm=TRUE))+((sd(ref$X3)/sd(sour2$X3,na.rm=TRUE)*sour2$X3)))) # calculate using ref and sour2 
plot(ref$X3,result1,ylab="Weight in pounds",xlab="Weight in pounds",col=2) 
points(ref$X3,ref$X3, col = 'green') 
points(ref$X3,result2, col = 'blue') # from this I get one plot showing 3 variables on y axis against one on x axis. 

Это только сюжет, используя X3 от всех данных, но все-таки у меня есть другие столбцы X1 до X14 Мой вопрос, как я могу сделать то же самое со всеми остальными столбцами, и, наконец, получит 14 участков.

+2

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

+0

Ваш код основывается на двух столбцах ('X3' и' X1'). Вы имели в виду это? (Зацикливание над 2 столбцами подразумевает, что разные bahviour зацикливаются на 1 столбец.) –

+0

Извините, я набрал неверно. Мой код полагается на 1 столбец: X3 –

ответ

2

Как упоминалось выше, вам нужно создать список имен столбцов и перебрать их.

lapply обеспечивает слегка более элегантную альтернативу петле for.

Выделив код более четко, вы увидите, что у вас есть нечетные двойные скобки в строках, назначающих result1 и result2. Для ясности рассмотрим разбиение этих строк на более мелкие вычисления.

columns <- paste0("X", 1:14) 
lapply(
    columns, 
    function(column) 
    { 
    result1 <- (
     mean(ref[[column]]) - 
     ((sd(ref[[column]])/sd(sour1[[column]])) * mean(sour1[[column]])) + 
     ((sd(ref[[column]])/sd(sour1[[column]]) * sour1[[column]])) 
    ) # calculate using ref and sour1 
    result2 <- (( 
     mean(ref[[column]]) - 
     ((sd(ref[[column]])/sd(sour2[[column]], na.rm=TRUE)) * mean(sour2[[column]], na.rm=TRUE)) + 
     ((sd(ref[[column]])/sd(sour2[[column]], na.rm=TRUE) * sour2[[column]])) 
    )) # calculate using ref and sour2 
    plot(
     ref[[column]], 
     result1, 
     ylab = "Weight in pounds", 
     xlab = "Weight in pounds", 
     col = 2 
    ) 
    points(ref[[column]], ref[[column]], col = 'green') 
    points(ref[[column]], result2, col = 'blue') 
    } 
) 
+0

Спасибо за вашу помощь. Но я получил эту ошибку: 'Ошибка в plot.window (.. .): нужны конечные значения «ylim» Кроме того: Предупреждающие сообщения: 1: In min (x): нет не пропускаемых аргументов до мин; return Inf 2: В max (x): отсутствие непустых аргументов до max; return -Inf' –

+1

Это может означать, что в вашем заговоре есть 'NA' или' Inf', поэтому у вас есть ошибки в вашем исчислении или эти значения 'NA' уже были в ваших файлах. – Pop

+0

О да, в моих данных есть НС. но я обработал их 'na.rm = TRUE'. Не было бы проблем! –

2

Чтобы получить Xi для i от 1 до 14, вы должны использовать paste функцию и альтернативный способ получения элементов в списке: ref[["X3"]] вместо ref$X3

Это дает на вашем примере:

for (i in 1:14){ 
     name <- paste('X',i,sep='') 
     result1 = (mean(ref[[name]]) - ((sd(ref[[name]])/sd(sour1[[name]]))*mean(sour1[[name]]))+ ((sd(ref[[name]])/sd(sour1[[name]])*sour1[[name]]))) # calculate using ref and sour1 
     result2 = ((mean(ref[[name]]) - ((sd(ref[[name]])/sd(sour2[[name]],na.rm=TRUE))*mean(sour2[[name]],na.rm=TRUE))+((sd(ref[[name]])/sd(sour2[[name]],na.rm=TRUE)*sour2[[name]])))) # calculate using ref and sour2 
     plot(ref[[name]],result1,ylab="Weight in pounds",xlab="Weight in pounds",col=2) 
     points(ref[[name]],ref$X1, col = 'green') 
     points(ref[[name]],result2, col = 'blue') 
} 
Смежные вопросы