Условная маркировка данных со сравнением предыдущей и следующей строк - PullRequest
2 голосов
/ 22 апреля 2019

имеет следующий тип данных и хочет пометить свои строки NA, проверив строки i-1 и i + 1 строк NA.

test <- data.frame(sd_value=c(77,18,3,16,32,76),  
                   value=c(5400,6900,7080,1892,4207,4403), 
                   label=c(c("good",NA,"unable"),c("bads",NA,"good")))

> test
  sd_value value  label
1       77  5400   good
2       18  6900   <NA>
3        3  7080 unable
4       16  1892   bads
5       32  4207   <NA>
6       76  4403   good

Условие, которое я хочу выполнитьпометить NA строки

на простом рисунке: сравните значение предыдущей и следующей строк со строкой NA.если разница <200, используйте метку этой строки для строки <code>NA.

Существует одно специальное условие, если предыдущая или следующая строка good.

  1. , если разница между i-1 или i + 1 строкой NA и diff (значением) <200 и такая же, как для diff (sd_value) <50, используйте i-1 или iМетка строки +1, которая удовлетворяет условию. </p>

  2. , если разность i + 1 помечена good и строка diff (значение) <200 и такая же, как для diff (sd_value) <50 useновая <code>eww! метка.

ожидаемый результат

> test
      sd_value value  label
    1       77  5400   good
    2       18  6900 unable
    3        3  7080 unable
    4       16  1892   bads
    5       32  4207   eww!
    6       76  4403   good

проверка значений diff i-1 и i + 1

> test%>%
+   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       77  5400   good        0           0
2       18  6900   <NA>     1500         -59
3        3  7080 unable      180         -15
4       16  1892   bads    -5188          13
5       32  4207   <NA>     2315          16
6       76  4403   good      196          44

1 Ответ

2 голосов
/ 22 апреля 2019

Отказ от ответственности : я использовал версию разработчика manymodelr (для экономии времени), которую я написал.

library(manymodelr) 
library(dplyr)
res<-rowdiff(test,"reverse")
names(res)<-c("sd_diff","diff_val")

#if difference between i-1 or i+1 row of NA 
#and diff(value) <200 and same as for diff(sd_value) <50 use i-1 or i+1 row's 
#label that meets the condition.
#if difference i+1 is labeled good and row diff(value)<200 and 
#same as for diff(sd_value)<50 use new eww! label.
df_bound<-cbind(test,res)
df_bound %>% 
  mutate(label=ifelse(is.na(label) & lead(label,1)=="good","eww",label),
         label=ifelse(is.na(label) & lead(diff_val,1)<200,lead(label,1),label))

Результат: NA могут быть заменены на 0. sd_diff и diff_val могут быть удалены.

sd_value value  label sd_diff diff_val
1       77  5400   good      NA       NA
2       18  6900 unable     -59     1500
3        3  7080 unable     -15      180
4       16  1892   bads      13    -5188
5       32  4207    eww      16     2315
6       76  4403   good      44      196
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...