Я хочу заполнить строки NA, основываясь на проверке различий между ближайшими строками без меток.
Например
data <- data.frame(sd_value=c(34,33,34,37,36,45),
value=c(383,428,437,455,508,509),
label=c(c("bad",rep(NA,4),"unable")))
> data
sd_value value label
1 34 383 bad
2 33 428 <NA>
3 34 437 <NA>
4 37 455 <NA>
5 36 508 <NA>
6 45 509 unable
Я хочу оценить, как изменить NA
строк, проверив разницу между sd_value
и value
теми, которые близки к bad
и unable
строкам.
если мы хотим получить различия между строками, которые мы можем сделать;
library(dplyr)
data%>%
mutate(diff_val=c(0,diff(value)), diff_sd_val=c(0,diff(sd_value)))
sd_value value label diff_val diff_sd_val
1 34 383 bad 0 0
2 33 428 <NA> 45 -1
3 34 437 <NA> 9 1
4 37 455 <NA> 18 3
5 36 508 <NA> 53 -1
6 45 509 unable 1 9
Условие, которым я хочу пометить строки NA
:
, если diff_val<50
и diff_sd_val<9
помечают их последней меткой non-NA
, иначе используют первую метку non-NA
после последней строки NA
.
Так что ожидаемый результат будет
sd_value value label diff_val diff_sd_val
1 34 383 bad 0 0
2 33 428 bad 45 -1
3 34 437 bad 9 1
4 37 455 bad 18 3
5 36 508 unable 53 -1
6 45 509 unable 1 9
Возможное решение, которое я уже приготовил:
custom_labelling <- function(x,y,label){
diff_sd_val<-c(NA,diff(x))
diff_val<-c(NA,diff(y))
label <- NA
for (i in 1:length(label)){
if(is.na(label[i])&diff_sd_val<9&diff_val<50){
label[i] <- label
}
else {
label <- label[i]
}
}
return(label)
}
что дает
data%>%
mutate(diff_val=c(0,diff(value)), diff_sd_val=c(0,diff(sd_value)))%>%
mutate(custom_label=custom_labelling(sd_value,value,label))
Ошибка в mutate_impl (.data, точки):
Ошибка оценки: пропущено значение, где требуется ИСТИНА / ЛОЖЬ.
Дополнительно: предупреждающее сообщение:
В if (is.na (label [i]) & diff_sd_val <9 & diff_val <50) {:
условие имеет длину> 1, и будет использоваться только первый элемент