Tengo un marco de datos como este:
dateColumnDF <- c("2022-04-12 00:02:57", "2022-04-12 00:02:58", "2022-04-12 00:02:59", "2022-04-12 00:03:00", "2022-04-12 00:03:02")
ValueColumnDf <- c("50","465","788","99","25")
Var1Df <- c("0", "0", "0","0","0")
Var2Df <- c("0", "0", "1","1","0")
Var3Df <- c("0","1","0","1","0")
df <- data.frame(dateColumnDF, ValueColumnDf,Var1Df,Var2Df,Var3Df)
colnames(df) <- c("timestamp","Value","Var1","Var2","Var3")
Y quiero obtener un marco de datos que refleje la forma en que los valores de Varx han ido cambiando, de un valor a otro (principalmente de 0 a 1 y viceversa), así:
firstColumn <- c("Var2", "Var2", "Var3", "Var3", "Var3","Var3")
secondColumn <- c("1", "0", "1","0","1","0")
thirdColumn <- c("2022-04-12 00:02:59", "2022-04-12 00:03:02", "2022-04-12 00:02:58","
2022-04-12 00:02:59","2022-04-12 00:03:00","2022-04-12 00:03:02")
fourthColum <- c("788","25","465","788","99","25")
df2 <- data.frame(firstColumn,secondColumn,thirdColumn,fourthColum)
colnames(df2) <- c("Var","flagChangedTo","timestamp","Value")
Descubrí que para ver los cambios en cada fila que debo hacer (usando dplyr):
which(df$value!= dplyr::lag(df$value))
Y que necesitaría poner esto dentro de un ciclo de las columnas de interés, algo como esto:
for(i in 3:ncol(df)) {
x <- which(df[,i]!= dplyr::lag(df[,i]))
}
Después de obtener los lugares donde cambia, ¿cómo puedo generar la matriz deseada?
Usando tidyr::pivot_longer
(ya estaba usando dplyr
), puede convertir la tabla en formato largo.
library(tidyr)
pivot_longer(df, starts_with("Var"), names_to = "Var", values_to = "flagChangedTo")
Esto da
timestamp Value Var flagChangedTo
<fct> <fct> <chr> <fct>
1 2022-04-12 00:02:57 50 Var1 0
2 2022-04-12 00:02:57 50 Var2 0
3 2022-04-12 00:02:57 50 Var3 0
4 2022-04-12 00:02:58 465 Var1 0
5 2022-04-12 00:02:58 465 Var2 0
...
Después de eso, podemos agrupar Var
y usar filter
para mantener solo las filas en las que el flagChangedTo
valor de la fila anterior no es igual a la fila actual, usando dplyr::lag
(como ya sugirió correctamente).
Juntos, y usando la tubería magrittr ( %>%
):
library(tidyr)
df %>%
pivot_longer(starts_with("Var"), names_to = "Var", values_to = "flagChangedTo") %>%
group_by(Var) %>%
arrange(timestamp) %>%
filter(flagChangedTo != lag(flagChangedTo)) %>%
ungroup() %>%
arrange(Var, timestamp)
Lo que da
timestamp Value Var flagChangedTo
<fct> <fct> <chr> <fct>
1 2022-04-12 00:02:59 788 Var2 1
2 2022-04-12 00:03:02 25 Var2 0
3 2022-04-12 00:02:58 465 Var3 1
4 2022-04-12 00:02:59 788 Var3 0
5 2022-04-12 00:03:00 99 Var3 1
6 2022-04-12 00:03:02 25 Var3 0
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras