Cómo leer csv. los archivos con los vectores de datos.tabla paquete?

0

Pregunta

He creado un tibble (denominado df) con un número y un vector en el interior:

library(tsibble)
library(data.table)

df <- tibble(var1 = 5, var2 = list(c(1,2,3)))

var1   var2
 5   c(1,2,3)

Entonces me salvó este tibble como un archivo csv. archivo así:

data.table::fwrite(df, file = "C/MyFolder/file.csv")

Ahora quiero leer este archivo:

df <- data.table::fread(file = "C/MyFolder/file.csv")

Y me pongo de nuevo tibble con el número y el texto dentro de una celda:

 var1   var2
   5    1|2|3

Cómo leer correctamente un archivo csv. archivo con el fin de conseguir de nuevo un tibble con un vector dentro de una celda?

data.table r
2021-11-22 17:17:04
2

Mejor respuesta

2

Usted podría no ser capaz de hacerlo de un solo golpe, pero aquí es una función personalizada que va a resolver su problema.

Función Personalizada

La función str_as_vct() se define como sigue:

str_as_vct <- function(x, sep = "|", transform = as.numeric, ...) {
  sapply(
    X = base::strsplit(
      x = x,
      split = sep,
      fixed = TRUE
    ),
    FUN = transform,
    ... = ...,
    simplify = FALSE,
    USE.NAMES = FALSE
  )
}

Descripción

Tomar un vector de character cadenas, cada uno con valores separados por un delimitador, y dividir cada cadena en un vector de sus valores.

El uso de

x: Un vector de character las cadenas, que representan vectores como delimitado por los valores.

sep: Un character de la cadena. El delimitador utilizado por las cadenas de x.

transform: Una función para transformar character vectores los vectores del tipo de datos deseado.

...: Más argumentos a la transform la función.

Solución

Armados con str_as_vct()su problema puede ser resuelto en una sola asignación:

df <- data.table::fread(file = "C/MyFolder/file.csv")[
  # Select all rows.
  ,
  
  # Select and transform columns.
  .(var1, var2 = str_as_vct(var2))
]

Resultado

Dado un primer df como este

df <- tibble(
  var1 = 1:3,
  var2 = list(
    c(1, 2, 3),
    c(4, 5, 6),
    c(7, 8, 9)
  )
)

la solución debe generar un data.table con el siguiente str()

Classes ‘data.table’ and 'data.frame':  3 obs. of  2 variables:
 $ var1: int  1 2 3
 $ var2:List of 3
  ..$ : num  1 2 3
  ..$ : num  4 5 6
  ..$ : num  7 8 9
 - attr(*, ".internal.selfref")=<externalptr> 

donde cada elemento de var2 es un numeric vector.

La conversión a un tibble a través de as_tibble(df) producirá:

# A tibble: 3 x 2
   var1 var2     
  <int> <list>   
1     1 <dbl [3]>
2     2 <dbl [3]>
3     3 <dbl [3]>
2021-11-22 19:45:31

Gracias, funciona, marcada como correcta. Pregunta: ¿y si hay muchas columnas y donde los vectores son, no sé por adelantado.
Jack Po

@JackPo Podrían aclarar? Suena como que usted está pidiendo dos cosas: (1) qué hacer si var2 contiene un desconocido distribución de algunas cadenas como "1|2|3" (que representan vectores) y otras cadenas como "stuff"; y (2) qué hacer si hay tantas columnas como var2.
Greg

He simplificado la pregunta y te dio la respuesta correcta. En realidad, tengo un tibble con muchas columnas y algunos de ellos pueden contener un vector
Jack Po

@JackPo Hmmm...que es un poco más complicado. Usted podría tener dificultad para distinguir entre (1) las células que contienen vectores numéricos como c(1,2,3) que se transforman en cadenas como "1|2|3"; y (2) las células que contenían frases como "1|2|3" para comenzar con. Usted podría utilizar df %>% across(everything(), str_as_vct) con el dplyr paquete, pero usted podría tener que construir en los controles para evitar inelegible columnas de ser transformado en NAs.
Greg

@JackPo También, gracias por marcar mi respuesta aceptada! ¿Serías tan amable de upvote así?
Greg

@Grec se me ocurrió la idea, gracias
Jack Po

Corrección: puede utilizar df %>% mutate( across(everything(), str_as_vct) ) con el dplyr paquete. Me fui de mutate() en mis comentarios anteriores.
Greg

@Grec Gracias ...
Jack Po
0

Parece que su csv archivo separados por | por lo que usted necesita en fread el separador argumento como:

fread(file = "file.csv", sep="|")

Saludos

2021-11-22 19:14:12

La solución funciona si hay una celda de la tabla, pero si hay varios de ellos, entonces el resultado es extraño (las células se fusionan y la otra celda es agregado). Me gustaría encontrar una solución universal.
Jack Po

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................