2 votes

Comment écrire un data.frame dans un fichier yaml en un format spécifique en R ?

Suppose I have a data.frame:

 x<-data.frame(files=c("/a/b/c/p1_fastq.gz", "/a/b/c/p2_fastq.gz"), ids=c("p1", "p2"))
 x
               files ids
1 /a/b/c/p1_fastq.gz  p1
2 /a/b/c/p2_fastq.gz  p2

Comment écrire cela comme un fichier yaml test.yaml tel que:

-
  id: "p1"
  fastq: "/a/b/c/p1_fastq.gz"
-
  id: "p2"
  fastq: "/a/b/c/p2_fastq.gz"

J'ai essayé le package yaml en R mais il écrit comme

files:
-/a/b/c/p1_fastq.gz
-/a/b/c/p2_fastq.gz

1voto

akrun Points 148302

Nous pourrions utiliser cat avec sprintf pour coller les éléments et les écrire dans un fichier

cat(with(x, sprintf('-\nid: "%s"\nfastq: "%s"\n', ids, files)),
        "\n", file = "test.yaml")

-output

entrer la description de l'image ici

1voto

r2evans Points 1187

La réponse de @akrun est excellente pour le R de base. Une alternative est d'utiliser le package yaml pour effectuer les tâches pour vous:

library(yaml)
yaml <- as.yaml(mtcars[1:3, 1:3])
cat(yaml, "\n")
# mpg:
# - 21.0
# - 21.0
# - 22.8
# cyl:
# - 6.0
# - 6.0
# - 4.0
# disp:
# - 160.0
# - 160.0
# - 108.0

Une alternative est de faire de la manière row-major (aussi appelée "non column major"), où chaque élément de liste représente une ligne:

yaml <- as.yaml(mtcars[1:3, 1:3], column.major = FALSE)
cat(yaml, "\n")
# - mpg: 21.0
#   cyl: 6.0
#   disp: 160.0
# - mpg: 21.0
#   cyl: 6.0
#   disp: 160.0
# - mpg: 22.8
#   cyl: 4.0
#   disp: 108.0

though yaml::as.yaml recommends the first method (column.major=TRUE, the default).

Avec vos données, l'une des méthodes suivantes

cat(as.yaml(x), "\n")
# files:
# - /a/b/c/p1_fastq.gz
# - /a/b/c/p2_fastq.gz
# ids:
# - p1
# - p2
cat(as.yaml(x, column.major = FALSE), "\n")
# - files: /a/b/c/p1_fastq.gz
#   ids: p1
# - files: /a/b/c/p2_fastq.gz
#   ids: p2

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X