Прогрессия не пропущенных значений, между которыми есть пропущенные значения - PullRequest
1 голос
/ 07 июня 2019

Чтобы продолжить предыдущую тему: Поиск не пропущенных значений между пропущенными значениями

Я также хотел бы выяснить, меньше ли значение перед отсутствующим значением, равно или больше значения после отсутствующего.

Чтобы использовать тот же пример из ранее:

df = structure(list(FirstYStage = c(NA, 3.2, 3.1, NA, NA, 2, 1, 3.2, 
3.1, 1, 2, 5, 2, NA, NA, NA, NA, 2, 3.1, 1), SecondYStage = c(NA, 
3.1, 3.1, NA, NA, 2, 1, 4, 3.1, 1, NA, 5, 3.1, 3.2, 2, 3.1, NA, 
2, 3.1, 1), ThirdYStage = c(NA, NA, 3.1, NA, NA, 3.2, 1, 4, NA, 
1, NA, NA, 3.2, NA, 2, 3.2, NA, NA, 2, 1), FourthYStage = c(NA, 
NA, 3.1, NA, NA, NA, 1, 4, NA, 1, NA, NA, NA, 4, 2, NA, NA, NA, 
2, 1), FifthYStage = c(NA, NA, 2, NA, NA, NA, 1, 5, NA, NA, NA, 
NA, 3.2, NA, 2, 3.2, NA, NA, 2, 1)), class = c("tbl_df", "tbl", 
"data.frame"), row.names = c(NA, -20L))

строки 13, 14 и 16 имеют пропущенные значения между пропущенными значениями. Выходные данные на этот раз должны быть: «то же самое», «больше» и «то же самое» для строк 13, 14 и 16, и сказать «N / A» для других строк.

1 Ответ

2 голосов
/ 07 июня 2019

Прямой подход состоит в том, чтобы разделить, преобразовать в числовое значение, взять последние 2 значения и сравнить с оператором ifelse, т.е.

sapply(strsplit(do.call(paste, df)[c(13, 14, 16)], 'NA| '), function(i){
                                  v1 <- as.numeric(tail(i[i != ''], 2)); 
                                  ifelse(v1[1] > v1[2], 'greater', 
                                           ifelse(v1[1] == v1[2], 'same', 'smaller'))
                                   })

#[1] "same"    "smaller" "same"

Примечание

Я воспринимал предыдущий ответ как данность (do.call(paste, df)[c(13, 14, 16)])

Более общий подход (как отметил Ронак, последние 2 цифры в некоторых случаях потерпят неудачу):

sapply(strsplit(gsub("([[:digit:]])+\\s+[NA]+\\s+([[:digit:]])", '\\1_\\2', 
                   do.call(paste, df)[c(13, 14, 16)]), ' '), function(i) { 
                                             v1 <- i[grepl('_', i)]; 
                                             v2 <- strsplit(v1, '_')[[1]]; 
                                            ifelse(v2[1] > v2[2], 'greater', 
                                               ifelse(v2[1] == v2[2], 'same', 'smaller')) })

#[1] "same"    "smaller" "same" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...