disputas de datos - los datos distribuidos en tres filas - dplyr

votos
0

Tengo muy datos desordenados establecidos algo como esto

A tibble: 200000 x 2
ChatData  
 <chr>                  
 1 Sep 30, 2018 7:12pm       
 2 Person A
 3 Hello                        
 4 Sep 30, 2018 7:11pm        
 5 Person B           
 6 Hello there                 
 7 Sep 30, 2018 7:10pm        
 8 Person A
...

Como se puede ver que pasa la fecha, nombre de la persona, comentario, y se repite.

Estoy trabajando en el problema y tener un método muy complejo que añade una columna de puntuación en función de los nombres etc ....

Me gustaría transformar esto en algo como esto

Person A , Person B
Hello      NA
NA         Hello there
how's you, NA
...

(La fecha como nombre de la fila o la tercera columna sería grande, pero no es esencial a la pregunta)

De manera óptima Busco a una solución dplyr / tidyverse estoy trabajando con una gran cantidad de datos por lo que no lentas para los bucles, etc ..

Los datos en bruto para trabajar con:

structure(list(ChatData = c(Sep 30, 2018 7:12pm, Person A, Hello, Sep 30, 2018 7:11pm, Person B, Hello there)), row.names = c(NA, -6L), class = c(tbl_df, tbl, data.frame))

Si alguien se pregunta estoy analizando los datos de Facebook Messenger, y esta es la forma que viene cuando se descargue.

Gracias.

Publicado el 19/09/2018 a las 17:07
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
2

En este caso, el conjunto de datos de partida tiene una sola columna (también conocido como característica). Pero en este caso, hay tres tipos de datos que se codifican aquí sobre cada mensaje: una marca de tiempo, la etiqueta de la persona, y un mensaje. Será más útil para transformar éstos en una tabla donde cada mensaje está en su propia fila, y cada columna representa un aspecto diferente de cada observación, es decir, en tiempo, o "ordenada", formato: https: //cran.r- project.org/web/packages/tidyr/vignettes/tidy-data.html

En el enfoque de abajo, el usuario define primero qué características se repiten en el conjunto de datos. Yo los llamo "cabeceras" aquí, ya que estoy trabajando hacia una mesa donde estos son los títulos de las columnas. A continuación, el script agrega que la información de los datos y convierte los datos de una sola columna en un formato ordenado, con una fila por cada mensaje, y un aspecto de cada mensaje en cada columna.

Su salida solicitado es una variación menor de este, se dirigió en la última línea a continuación: %>% spread(person, msg), que separa a la persona A y la persona B de datos en columnas separadas.

library(tidyverse)

header_names <- c("timestamp", "person", "msg")

rows_per <- length(header_names)
data_length <- length(data$ChatData) / rows_per
data2 <- data %>%
  mutate(msg_number = rep(1:(nrow(data)/rows_per), each=rows_per),
         # This line repeats the header_names sequence for each msg
         header = rep(header_names, data_length)) %>%
  spread(header, ChatData) %>%
  mutate(timestamp = lubridate::mdy_hm(timestamp)) %>%
  spread(person, msg)


head(data2)
# A tibble: 2 x 4
  msg_number timestamp           `Person A` `Person B` 
       <int> <dttm>              <chr>      <chr>      
1          1 2018-09-30 19:12:00 Hello      NA         
2          2 2018-09-30 19:11:00 NA         Hello there
Respondida el 19/09/2018 a las 17:35
fuente por usuario

votos
1

A medida que básicamente sólo tiene un vector de caracteres que desea convertir en un hoja.de.datos 3 columnn

Otra opción es utilizar simplemente matrixy especificar ncol=3ybyrow=TRUE

# your sample data
d <- structure(list(ChatData = c("Sep 30, 2018 7:12pm", "Person A", "Hello", "Sep 30, 2018 7:11pm", "Person B", "Hello there")), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"))

matrix( d$ChatData, ncol=3, byrow=TRUE,
        dimnames=list( NULL, c("date_time", "person", "message")) )

El resultado es una matriz de caracteres:

     date_time             person     message      
[1,] "Sep 30, 2018 7:12pm" "Person A" "Hello"      
[2,] "Sep 30, 2018 7:11pm" "Person B" "Hello there"

Sin embargo, se puede envolver en que as.data.frame()para convertir a un hoja.de.datos y seguir trabajando a partir de ahí con dplyrsi eso es lo que quiere.

Poner juntos para una solución completa:

Se convierte en un buen poco corto y legible de código de la OMI:

library(dplyr)
library(lubridate)

result_df <- 
  matrix( d$ChatData, ncol=3, byrow=TRUE, 
          dimnames=list(NULL, c("date_time", "person", "message")) ) %>% 
  as.data.frame() %>% 
  mutate(date_time=lubridate::mdy_hm(date_time))
Respondida el 20/09/2018 a las 14:46
fuente por usuario

votos
0

Aquí es uno de los enfoques:

data %>% group_by(msg_number = rep(1:(nrow(data)/3), each=3)) %>% 
  summarize(msg_data = list(ChatData)) %>% as.data.frame

  msg_number                                   msg_data
1          1       Sep 30, 2018 7:12pm, Person A, Hello
2          2 Sep 30, 2018 7:11pm, Person B, Hello there

Este número cada mensaje y pone los datos en una lista de columnas.

Respondida el 19/09/2018 a las 17:23
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more