40 votes

Quel est un bon moyen de lire ligne par ligne dans R?

J'ai un fichier où chaque ligne est un ensemble de résultats recueillis dans certains répliquer d'une expérience. Le nombre de résultats pour chaque expérience (c'est à dire le nombre de colonnes dans chaque ligne) peuvent différer. Il n'y a également aucune importance à l'ordre des résultats dans chaque ligne (le premier résultat dans la ligne 1 et le premier résultat 2 ne sont pas plus que n'importe quelle autre paire; ce sont des ensembles de résultats).

Le fichier ressemble à ceci:

2141 0 5328 5180 357 5335 1 5453 5325 5226 7 4880 5486 0 
2650 0 5280 4980 5243 5301 4244 5106 5228 5068 5448 3915 4971 5585 4818 4388 5497 4914 5364 4849 4820 4370
2069 2595 2478 4941 
2627 3319 5192 5106 32 4666 3999 5503 5085 4855 4135 4383 4770 
2005 2117 2803 2722 2281 2248 2580 2697 2897 4417 4094 4722 5138 5004 4551 5758 5468 17361 
1914 1977 2414 100 2711 2171 3041 5561 4870 4281 4691 4461 5298 3849 5166 5578 5520 4634 4836 4905 5105 5089
2539 2326 0 4617 3735 0 5122 5439 5238 1
25 5316 21173 4492 5038 5944 5576 5424 5139 5184 5 5096 4963 2771 2808 2592 2
4963 9428 17152 5467 5202 6038 5094 5221 5469 5079 3753 5080 5141 4097 5173 11338 4693 5273 5283 5110 4503 51
2024 2 2822 5097 5239 5296 4561 

sauf que chaque ligne est beaucoup plus longue (jusqu'à quelques milliers de valeurs). Comme on peut le voir, tous les balues sont des entiers non négatifs.

Pour faire court ce n'est pas une table normale, où les colonnes ont des significations. C'est juste un tas de résultats - chaque jeu en ligne.

Je voudrais lire tous les résultats, puis à faire quelques opérations sur chaque expérience (ligne), comme le calcul de la ecdf. Je tiens également à calculer la moyenne ecdf sur toutes les répétitions.

Mon problème: comment dois-je lire cette étrange à la recherche de fichiers? Je suis donc de l'utiliser à l' read.table que je ne sais pas j'ai jamais essayé autre chose... Dois-je utiliser certaines de bas niveau comme readlines? Je suppose que la sortie préféré serait une liste (ou un vecteur?) de vecteurs. J'ai regardé scan mais il semble que tous les vecteurs doivent être de la même longueur il.

Toutes les suggestions seront appréciées.

*Mise à JOUR*en Suivant les suggestions ci-dessous, je vais maintenant faire quelque chose comme ceci:

con <- file('myfile') 
open(con);
results.list <- list();
current.line <- 1
while (length(line <- readLines(con, n = 1, warn = FALSE)) > 0) {
 results.list[[current.line]] <- as.integer(unlist(strsplit(line, split=" ")))
 current.line <- current.line + 1
} 
close(con)

Semble fonctionner. Il ne semble OK?

Quand j' summary(results.list) je reçois:Longueur de la Classe de Mode

      Length Class  Mode  
 [1,] 1091   -none- numeric
 [2,] 1070   -none- numeric
   ....

Ne pas la classe entière? Et qu'est-ce que la mode?

30voto

JD Long Points 20477

L'exemple Josh lié est celui que j'utilise tout le temps.

inputFile <- "/home/jal/myFile.txt"
con  <- file(inputFile, open = "r")

dataList <- list()
ecdfList <- list()

while (length(oneLine <- readLines(con, n = 1, warn = FALSE)) > 0) {
    myVector <- (strsplit(oneLine, " "))
    myVector <- list(as.numeric(myVector[[1]]))
    dataList <- c(dataList,myVector)

    myEcdf <- ecdf(myVector[[1]])
    ecdfList <- c(ecdfList,myEcdf)

  } 

close(con)

J'ai édité l'exemple de créer deux listes à partir de vos données d'exemple. dataList est une liste où chaque élément de la liste est un vecteur de valeurs numériques à partir de chaque ligne dans votre fichier texte. ecdfList est une liste où chaque élément est une ecdf pour chaque ligne dans votre fichier texte.

Vous devriez probablement ajouter quelques try() ou trycatch() logique là pour gérer correctement les situations où l'ecdf ne peut pas être créé en raison de la valeur null ou quelque chose du genre. Mais l'exemple ci-dessus devrait vous obtenir assez proche. Bonne chance!

19voto

Joshua Ulrich Points 68776

Oui, vous pouvez utiliser readLines . JD Long a un bon exemple , que j'ai légèrement modifié et fourni ci-dessous.

 con  <- file(inputFile, open = "r")

while (length(oneLine <- readLines(con, n = 1, warn = FALSE)) > 0) {
  # do stuff
} 

close(con)
 

8voto

Marek Points 18000

Pourquoi se préoccuper de la lecture ligne par ligne?

 results.list <- lapply(strsplit(readLines("myfile")," "), as.integer)
 

vous donne la liste des vecteurs entiers.

À propos de vos questions supplémentaires: consultez ?mode (en bref, mode est numérique pour les chiffres, typeof peut être entier ou double, et class numérique ou entier). Pour voir s’il existe des nombres entiers, vérifiez str(results.list) ou lapply(results.list, class) .

5voto

Brandon Bertelsen Points 13424

Ou:

 df <- read.delim(file="whatever", header=F, sep = " ")
 

2voto

Dirk Eddelbuettel Points 134700

Utilisation

 line <- readLines(con, 1)
 

lire une ligne de la connexion con , ce qui peut être aussi simple que con <- file(filename, "r") .

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