2017-01-02 4 views
0

Образец данных, которые у меня есть.
hour <- c(rep(0,5), rep(1,5),rep(0,5), rep(1,5)) rain <- c(rep(0.1,10),rep(0.0,10)) df1<-data.frame(rain,hour) df1$csum <- with(df1, ave(df1$hour, cumsum(df1$hour == 0), FUN = cumsum))логический на основе строк ниже и выше в другом векторе

Шаги:
1. Найти значения 1 в 'CSUM' (шестому/16).
2. Посмотрите на значения 3 строки вверх и 5 вниз в «дождь» (1: 9/11: 19 в этом случае), вокруг позиции, определяемой 1-м шагом в var 'csum',
3. если их сумма равна > = 0,1; чем первые три значения 1 в var 'час' (6: 8) преобразуются в 0, во втором случае они остаются неизменными, поскольку сумма равна 0.

Ожидаемый результат: Первые три значения 1 в df1 $ часов переключаются на 0

hour = c(0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1) 
+0

так что вы хотите, чтобы выполнить эти шаги только один раз? когда '1' происходит в первый раз. –

+0

, если я правильно понял, просто ''() 'все достаточно и' if() ' –

+0

точно. 1 на самом деле означает, что некоторые другие критерии были выполнены, а затем я смотрю в дождь в окне времени 8 часов; если не было значительного дождя (0,1 или более), первые три часа (значения 1) не учитываются. –

ответ

1

там может быть много улучшений в эту золу:

x = which(df1$csum == 1) 

func <- function(i) { 
    lower_lim = i-5 # out-of-bound errors can happen, prefer max(1, (i-5)) 
    upper_lim = i+3 # prefer min(1, (i+3)) 
    if (sum(df1$rain[lower_lim:upper_lim]) >= 0.1){ 
    y <- df1$hour[lower_lim:upper_lim] 
    y[which(y == 1)[1:3]] = 0 
    df1$hour[lower_lim:upper_lim] <- y 
    } 
    assign("df1", df1, envir = .GlobalEnv) 
} 

sapply(x, func) 

# df1 
# rain hour csum 
#1 0.1 0 0 
#2 0.1 0 0 
#3 0.1 0 0 
#4 0.1 0 0 
#5 0.1 0 0 
#6 0.1 0 1 
#7 0.1 0 2 
#8 0.1 0 3 
#9 0.1 1 4 
#10 0.1 1 5 
#11 0.0 0 0 
#12 0.0 0 0 
#13 0.0 0 0 
#14 0.0 0 0 
#15 0.0 0 0 
#16 0.0 1 1 
#17 0.0 1 2 
#18 0.0 1 3 
#19 0.0 1 4 
#20 0.0 1 5 
+0

Не так, так как мне нужно получить функцию, которую я бы применил к каждому месту, где это происходит в строке, а не только в первом. Он работает только для первого случая ... –

+0

U были почти там. :) внесли некоторые изменения в вопрос ... –

+0

Я действительно не люблю использовать 'assign()' в коде, но я не знаю, как отразить изменения, сделанные в 'df1' вне области' sapply () '. как-то может помочь мне здесь –