R data.table: определить шаблон значений в каждой группе - PullRequest
2 голосов
/ 01 апреля 2020

Скажем, у меня есть data.table, например:

set.seed(10)
data.table(group = rep(c("a","b","c"), each=5), date = rep(1:5,3), value = sample(c(95:105,""),15, replace=TRUE))

Внутри каждой группы в столбце значений я хотел бы проверить (простым способом), есть ли "" (пусто) символ), или группа пустых символов, которым предшествует и сопровождается значением.

Итак, все в порядке: "", 95,103 и т. д. c .... (пустой символ - первый внутри группы), но приведенные ниже шаблоны являются примерами "отсутствующих данных", которые я хотел бы обнаружить:

95, "", 103, ... (пустой символ в середине )

95, "", "", 103 ... (несколько пустых символов в середине)

95, 103, "" (пустой символ в конце)

Итак, в выходных данных ниже я смогу получить строку / группу A, и, если групп много, я должен получить все группы (или строки)

    group date value
 1:     a    1   105
 2:     a    2   103
 3:     a    3   104
 4:     a    4      
 5:     a    5   101
 6:     b    1   102
 7:     b    2   100
 8:     b    3   101
 9:     b    4    97
10:     b    5   102
11:     c    1   104
12:     c    2   101
13:     c    3   104
14:     c    4    96
15:     c    5   102

Редактировать: Что мне нужно сделать, это выбрать строки, которые имеют неправильный шаблон (таким образом, пустые строки в середине или в конце) , чтобы можно было обнаружить, есть ли какие-либо ошибки в а набор данных rge. Таким образом, в таблице в моем примере желаемым выводом будет 4-я строка, так как она имеет «пропущенное значение» (пустой символ между значениями)

     group date value
1:     a    4   

(если бы было больше нежелательных строк, конечно, я бы хотел получить их все)

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Если ваш data.table не отсортирован по столбцу «date», вы можете использовать следующее:

DT[order(date), order := c(1:.N) , group]
DT[value == "" & order > 1L]

output:

   group date value order
1:     a    4           4

данные такие же, как у вас :

set.seed(10)
DT <- data.table(group = rep(c("a","b","c"), each=5), date = rep(1:5,3), 
                 value = sample(c(95:105,""),15, replace=TRUE))
0 голосов
/ 01 апреля 2020

Вот вариант:

DT[, rw := rleid(value==""), group]
DT[value=="" & rw>1L]

вывод:

   group date value rw
1:     a    4        2

данные:

library(data.table)
set.seed(10)
DT <- data.table(group = rep(c("a","b","c","d"), each=5), 
    date = rep(1:5,4), value = c(sample(c(95:105,""),15, replace=TRUE), c("",2,3,4,5)))
...