A partir dos seguintes dados agrupados por id
e visit
, que incluem uma mistura de numérico e texto/caractere values
, como criar essas 3 novas colunas:
count_wotxt
: contar porid
evisit
mas sem considerar valores de texto/caracterediff_value_first
: calcule a diferença entre cada valor numérico versus o primeirovisit
de cadaid
, ignorando texto/caracterevalues
diff_value_previous
: calcula a diferença entre cada valor numérico em relação ao anteriorvisit
para cada umid
, ignorando texto/caracterevalues
Dados:
dat <-
structure(list(id = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("1", "2"), class = "factor"),
visit = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 1L,
1L, 1L, 2L, 2L, 2L), .Label = c("1", "2"), class = "factor"),
value = c("5", "7", "10", "20", "15", "text0", "25", "text1",
"100", "text2", "text3", "120", "text4", "50", "45"), count = c(1L,
2L, 3L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 1L, 2L, 3L)), class = "data.frame", row.names = c(NA,
-15L))
Saída desejada:
> dat2
id visit value count count_wotxt diff_value_first diff_value_previous
1 1 1 5 1 1 0 0
2 1 1 7 2 2 2 2
3 1 1 10 3 3 5 3
4 1 2 20 1 1 0 0
5 1 2 15 2 2 -5 -5
6 1 2 text0 3 NA NA NA
7 1 2 25 4 3 5 10
8 1 2 text1 5 NA NA NA
9 2 1 100 1 1 0 0
10 2 1 text2 2 NA NA NA
11 2 1 text3 3 NA NA NA
12 2 1 120 4 2 20 20
13 2 2 text4 1 NA NA NA
14 2 2 50 2 1 NA 0
15 2 2 45 3 2 NA -5
Obrigado pela ajuda
Aqui está uma lógica que poderíamos aplicar para obter o resultado desejado: acho que a parte mais desafiadora é a diferença da linha anterior na presença de NAs. Eu resolvi isso usando
fill
:Abaixo, a solução, baseada principalmente na proposta de TarJae (obrigado!), ligeiramente modificada no final,
que dá