Obtener valores de columna basados en cambios en otra columna

Aaron Parrilla

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?

Bajo

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 Vary usar filterpara mantener solo las filas en las que el flagChangedTovalor 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

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados

Obtener valores de columna basados en cambios en otra columna

Obtener valores basados en otra columna

Obtener valores basados en el máximo de otra columna

Sumar valores únicos basados en otra columna

Pandas, resta valores basados en el valor de otra columna

Agregar valores de una columna basados en valores en otra columna en pandas

restar valores en una columna basados en otra columna

Mutar valores en una columna basados en otra columna

Obtenga valores distintos de una columna basados en valores distintos en otra columna usando R

Agregar nueva columna con valores basados en condiciones en valores de otra columna

Actualizar valores de columna basados en valores iguales en otra columna

Valores de Python Shift en una columna basados en Nan o booleanos en otra columna

SQL SELECT: nueva columna con valores basados en otra columna

Copiar los valores de una columna, basados en los valores de otra columna

R: ¿Cómo crear una nueva columna con valores basados en ciertos valores de otra columna?

Dividir valores de columna basados en delimitadores y coincidencias con otra columna en postgres

Cree una nueva columna con valores vectoriales basados en grupos de otra columna de caracteres

Oracle SQL: obtenga el recuento de valores de columna distintos basados en otra columna

Establecer valores de columna basados en la búsqueda de otra columna

Sumar valores de una columna basados en otra columna booleana, tanto verdaderos como falsos por separado

Encuentre los valores mínimos de la columna df basados en otra columna

Encuentre los valores mínimos de la columna df basados en otra columna

Repetir valores en una columna basados en otra

Repetir valores en una columna basados en otra

Filtrar valores basados en otra columna en SQL

Mostrar valores de listagg basados en valores en otra columna (parte 2)

Crea grupos basados en valores de columna

Valores correspondientes en una columna basados en valores en otra columna

Valores promedio de una columna basados en los valores de otra

TOP Lista

CalienteEtiquetas

Archivo