2013-03-15 2 views
0

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

columns <- paste0("X", 1:13) 
ref <- read.table("D:\\DAS_asc.txt", sep="",header=TRUE) 
library(zoo) 
mean <- lapply(columns, function(column) { 
       rollapply(ref[[column]], 5, FUN = mean,na.rm=TRUE, fill=NA) }) 

, когда я только что напечатал «означает», чтобы увидеть результаты, я обнаружил, что расчеты не правильно (я сделал это вручную, чтобы проверить!). Я думал, что это может быть сама функция movingave, но я проверил и работал хорошо:

s=c(1,5,2,4) 
rollapply(s, 2, FUN = mean,na.rm=TRUE, fill=NA) 
[1] 3.0 3.5 3.0 NA 
rollapply(s, 3, FUN = mean,na.rm=TRUE, fill=NA) 
[1]  NA 2.666667 3.666667  NA 

Интересно, что случилось, когда мы делаем это с текстовым файлом?

первые две строки файла:

"0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" 
"2" 0.0493461075417879 0.0262911450465596 0.0426611743228151 0.0954854469641096 0.0933782886825547 0.218212200747129 0.285405481705908 0.226218243796976 0.146648210899044 0.115716572518044 0.0675501818197432 0.069120070466305 0.281314574594234 0.364434947521643 0.0124844383491671 
+0

Да, но я указал от 1 до 13 здесь: 'columns <- paste0 (" X ", 1:13)' –

+0

Хотите скорректировать среднее значение одного столбца или скользящее среднее по 13 столбцам для каждой строки ? –

+1

@JonssonSali Почему вы говорите о текстовом файле? Я думаю, что вопрос заключается в простом вычислении скользящего среднего по 13 столбцам/переменным data.frame. Постарайтесь быть ясными и представить пример воспроизводимости, пожалуйста. – agstudy

ответ

1

Если вы хотите скользящее среднее колонки я не вижу проблемы с вашим кодом. Если вы имеете в виду скользящее среднее через ряд ваших 13 столбцов использовать apply на вашей реф data.frame вместо ...

movAvg <- t(apply(ref[,columns] , 1 , fun = function(x){ rollapply(x , width = 5, FUN = mean, na.rm=TRUE, fill=NA) })) 

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

пустышки пример разницы

w <- 1:5 
x <- 1:5 
y <- 1:5 
z <- 1:5 
df <- data.frame(w ,x , y , z) 
df 
#  w x y z 
# 1 1 1 1 1 
# 2 2 2 2 2 
# 3 3 3 3 3 
# 4 4 4 4 4 
# 5 5 5 5 5 

cols <- c("w" , "x" , "y" , "z") 
# Rolling average across columns using list of specified columns 
laply(cols , function(x){ rollapply(df[[x]] , FUN = mean , width = 2 , na.rm=TRUE, fill=NA) }) 
#   1 2 3 4 5 
# [1,] 1.5 2.5 3.5 4.5 NA 
# [2,] 1.5 2.5 3.5 4.5 NA 
# [3,] 1.5 2.5 3.5 4.5 NA 
# [4,] 1.5 2.5 3.5 4.5 NA 

# Which is the same as... 
t(apply(df[ , cols] , 2, function(x){ rollapply(x , width = 2, FUN = mean, na.rm=TRUE, fill=NA) })) 
#  [,1] [,2] [,3] [,4] [,5] 
# w 1.5 2.5 3.5 4.5 NA 
# x 1.5 2.5 3.5 4.5 NA 
# y 1.5 2.5 3.5 4.5 NA 
# z 1.5 2.5 3.5 4.5 NA 

# Rolling average across rows... 
t(apply(df[,cols] , 1 , FUN = function(x){ rollapply(x , FUN = mean , width = 2 , na.rm=TRUE, fill=NA ) })) 
1

Попробуйте это:

columns <- paste0("X", 1:13) 
ref <- read.table("D:\\DAS_asc.txt", sep="",header=TRUE) 
library(zoo) 

movingaverages<-lapply(ref[,columns], function(column) { 
    rollapply(column, 5, FUN = mean,na.rm=TRUE, fill=NA) }) 

#OR 
movingaverages<-apply(ref[,columns], 2, function(column) { 
    rollapply(column, 5, FUN = mean,na.rm=TRUE, fill=NA) }) 

# substract from old values: 
ref[,columns]<-ref[,columns]-movingaverages 

# note, movingaverages is not a data.frame 
# you can convert it to such like this: 

data.frame(movingaverages) 

EDIT: OP хотел вычитать результаты от старых значений.

+0

Разве вы не хотите применять по строкам? –

+0

В исходном коде скользящие средние для каждого столбца? –

+0

В этом случае его исходный код сработал бы. Каждый столбец передается в rollapply как вектор? Если бы это было не то, что он ожидал, я предполагал, что он имел в виду скользящий средний по строкам. –

Смежные вопросы