Comment lire un fichier csv. les fichiers avec des vecteurs de données.tableau paquet?

0

La question

J'ai créé un tibble (nommé df) avec un numéro et d'un vecteur à l'intérieur:

library(tsibble)
library(data.table)

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

var1   var2
 5   c(1,2,3)

Ensuite, j'ai sauvé cette tibble au format csv. fichier comme suit:

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

Maintenant, je veux lire ce fichier:

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

Et j'ai de nouveaux tibble avec le numéro et le texte à l'intérieur d'une cellule:

 var1   var2
   5    1|2|3

Comment lire correctement un fichier csv. fichier afin d'obtenir de nouveau un tibble avec un vecteur à l'intérieur d'une cellule?

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

La meilleure réponse

2

Vous pourriez ne pas être en mesure de le faire d'un seul coup, mais voici une fonction personnalisée qui permettra de résoudre votre problème.

Fonction Personnalisée

La fonction str_as_vct() est définie comme suit:

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
  )
}

Description

Prendre un vecteur de character les chaînes, chacune avec des valeurs séparées par un délimiteur, et de diviser chaque chaîne en un vecteur de ses valeurs.

L'utilisation de la

x: Un vecteur de character les chaînes, qui représentent les vecteurs des valeurs délimitées par des.

sep: Un character chaîne de caractères. Le délimiteur utilisé par les chaînes de x.

transform: Une fonction pour transformer character vecteurs dans les vecteurs du type de données.

...: D'autres arguments à l' transform fonction.

Solution

Armé avec str_as_vct()votre problème peut être résolu en une seule commande:

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

Résultat

Compte tenu d'une première df comme ceci

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

la solution devrait donner un data.table avec les éléments suivants 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> 

où chaque élément de var2 est un numeric vecteur.

La Conversion à une tibble via as_tibble(df) rendement:

# 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

Merci, fonctionne, marquée comme étant correcte. Question: que faire si il ya beaucoup de colonnes et où les vecteurs sont, je ne sais pas à l'avance.
Jack Po

@JackPo Pourriez-vous préciser? On dirait que vous vous êtes posé deux choses: (1) que faire si var2 contient un inconnu distribution de certaines chaînes de caractères comme "1|2|3" (qui sont des vecteurs) et d'autres chaînes comme "stuff"; et (2) que faire si il y a beaucoup de colonnes, comme var2.
Greg

J'ai simplifié la question et vous avez donné la bonne réponse. En réalité, j'ai un tibble avec de nombreuses colonnes et certains d'entre eux peut contenir un vecteur
Jack Po

@JackPo Hmmm...c'est un peu plus compliqué. Vous pourriez avoir un moment difficile la distinction entre (1) les cellules contenant des vecteurs comme le numérique c(1,2,3) qui ont été transformées en chaînes de caractères comme "1|2|3"; et (2) des cellules qui contenaient des chaînes de caractères comme "1|2|3" pour commencer avec. Vous pouvez utiliser df %>% across(everything(), str_as_vct) avec l' dplyr paquet, mais vous pourriez avoir à construire dans les contrôles pour empêcher inadmissible colonnes d'être transformé en NAs.
Greg

@JackPo Aussi, merci pour le marquage de ma réponse acceptée! Souhaitez-vous gentiment upvote ainsi?
Greg

@Grec j'ai eu l'idée, merci
Jack Po

Correction: Vous pouvez utiliser df %>% mutate( across(everything(), str_as_vct) ) avec l' dplyr package. J'ai laissé de côté mutate() dans mes commentaires précédents.
Greg

@Grec Grâce ...
Jack Po
0

Il semble que votre csv le fichier est séparé par | si vous avez besoin de fread l'élément de séparation argument comme:

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

Salutations

2021-11-22 19:14:12

Votre solution fonctionne si il y a une cellule de la table, mais si il y en a plusieurs, alors le résultat est étrange (les cellules sont fusionnées et une autre cellule est ajoutée). Je voudrais trouver une solution universelle.
Jack Po

Dans d'autres langues

Cette page est dans d'autres langues

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