2014-12-16 1 views
-2

Я пытаюсь проанализировать дисперсию данных температуры через цикл for, чтобы удалить некоторые неверные данные о снеге. Идея состоит в том, что если температура ниже 0 ° C, и если дисперсия следующих трех значений составляет более 0,1 (значения здесь только для примера), это не может быть снег (но если дисперсия слабее, это нормально); поэтому я установил для этих данных глубину снега до 0. Я попытался написать небольшую функцию, чтобы сделать это. Ошибок нет, но ничего не происходит. Мой способ записи внутри цикла должен быть неправильным.Анализ данных дисперсии с помощью цикла for в R

data <- data.frame(temperature=c(1,2,0,-1,-5,-3,-4,-1,-1,-1),snow=c(3,4,5,10, 
    11,12,12,15,15,16))  

    plant <- function(x,y){ 
    for (j in 1:length(x)) 
    { if(!is.na(x[j]) && !is.na(x[(j+3)]) && (x[j]<0) 
    && (x[(j+3)]<0) && (var(x[j:(j+3)])>0.1))      
     {y[j:(j+3)] <- 0 } 
    } 
    return(y) 
    } 

    data[,2] <- mapply(plant,data[,1],data[,2]) 

Мои окончательные данные (в данном примере) должен выглядеть следующим образом:

finaldata <- data.frame(temperature=c(1,2,0,-1,-5,-3,-4,-1,-1,-1), 
    snow=c(3,4,5,0,0,0,0,15,15,16)) 

Что случилось моя функция? Как я могу сделать это легко?

+0

Я не понимаю, описание того, что вы функция должна делать точно. Каким образом ваша функция может привести к предполагаемому результату? Если он устанавливает первые три значения снега в ноль, у вас будет огромная дисперсия для всех последующих значений с вашим движущимся окном. Кроме того, почему вы используете 'mapply' здесь? Но самое главное, весь ваш подход кажется мне очень подозрительным. Если вы не доверяете некоторым своим значениям снега, почему вы доверяете другим? И почему вы считаете, что все они равны нулю из-за вашего критерия дисперсии? В лучшем случае вы можете уйти, установив их в NA. – Roland

+0

Кроме того, если вы установите снег на 0 для отрицательных температур, почему бы не использовать положительные температуры? – Roland

+0

Благодарим вас за замечание @LyzandeR. Я посмотрел на последние заданные R-вопросы, у которых пока нет ответов, но я не нашел того, на что я смог ответить своими R-навыками. Я иногда использую R, и я стараюсь найти ответ на свой вопрос как можно больше, благодаря более старым вопросам и ответам. Я верю и надеюсь, что ответ на мой вопрос может помочь другим людям позже, когда у них будет такая же проблема, и будет искать ответ, как я, сначала на google. – jeff6868

ответ

2

Я бы предложил добавить столбцы в data.frame, используя rollapply, а затем использовать ifelse для проверки значений столбцов.

library(zoo) 
#data$var3<- rollapply(data$snow, 3, var, fill=0, align="left") 
data$var3 <- c(rollapply(data$snow, 3, var, align="left")[-1], rep(0,3)) 
data$snow3 <- ifelse(data$temp<0 & data$var3>0.1, 0, data$snow) 

    temperature snow  var3 snow3 
1   1 3 10.3333333  3 
2   2 4 10.3333333  4 
3   0 5 1.0000000  5 
4   -1 10 0.3333333  0 
5   -5 11 3.0000000  0 
6   -3 12 3.0000000  0 
7   -4 12 0.3333333  0 
8   -1 15 0.0000000 15 
9   -1 15 0.0000000 15 
10   -1 16 0.0000000 16 
+0

Спасибо @Chris S. за ваш ответ! Это мне очень помогло! Я просто изменил способ вычисления дисперсии, но я оставил остальное ваше предложение по моей проблеме. И сейчас это работает неплохо. Отлично сработано! – jeff6868

0

Наконец, мое решение:

library(zoo) 

data <- data.frame(temperature=c(1,2,0,-1,-5,-3,-4,-1,-1,-1),snow=c(3,4,5,10, 
11,12,12,15,15,16)) 

data$var3 <- NA 
for (i in 1:nrow(data)) { 
if(!is.na(data[i,1]) && (data[i,1]<0)) { 
j=(i+3) 
data[i,3] <- var(data[i:j,1]) 
} 
} 

data$snow3 <- ifelse(data$temperature<0 & data$var3>0.1, 0, data$snow) 
Смежные вопросы