найти появление последовательной фразы в столбцах - PullRequest
1 голос
/ 18 июня 2019

У меня есть следующий фрейм данных, описывающий прогрессирование чего-либо от текущего состояния («0») до 5 лет спустя.

df = structure(list(Prog0to1 = c("different", "different", "same", 
"different", "disappeared", "different", "same", "same", "different", 
"different"), Prog1to2 = c("disappeared", "disappeared", "disappeared", 
"different", "different", "different", "different", "same", "same", 
"Deceased"), Prog2to3 = c("disappeared", "different", "disappeared", 
"same", "disappeared", "same", "different", "different", "disappeared", 
"Deceased"), Prog3to4 = c("different", "same", "disappeared", 
"same", "disappeared", "same", "disappeared", "same", "disappeared", 
"Deceased"), Prog4to5 = c("same", "same", "disappeared", "different", 
"disappeared", "different", "disappeared", "same", "disappeared", 
"Deceased")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-10L))

в df "то же самое" означает, что состояние предыдущего года совпадает с текущим годом.

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

Таким образом, выходной вектор должен быть:

v = c(1, 2, 1, 2, 0, 2, 1, 2, 1, 0),

где 8-е значение - это медиана между 2 и 2, то есть 2 (есть два периода "одного и того же", разделенных "разными").

Как мне этого добиться?

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Мы можем использовать melt от data.table

library(data.table)
melt(setDT(df, keep.rownames = TRUE), id.var = 'rn')[,
     rleid(value == "same") * (value == "same"), .(rn)][V1 != 0, median(.N), .(rn)]
1 голос
/ 18 июня 2019

Мы могли бы использовать apply с rle и взять median из lengths, где values равно "same".

vals <- apply(df == "same", 1, function(x) median(with(rle(x), lengths[values])))
vals
#[1]  1  2  1  2 NA  2  1  2  1 NA

Если вы хотите 0 вместо NA s

replace(vals, is.na(vals), 0)
#[1] 1 2 1 2 0 2 1 2 1 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...