web-dev-qa-db-fra.com

Lire uniquement les colonnes sélectionnées

Quelqu'un peut-il me dire s'il vous plaît comment lire uniquement les 6 premiers mois (7 colonnes) pour chaque année des données ci-dessous, par exemple en utilisant read.table()?

Year   Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec   
2009   -41  -27  -25  -31  -31  -39  -25  -15  -30  -27  -21  -25
2010   -41  -27  -25  -31  -31  -39  -25  -15  -30  -27  -21  -25 
2011   -21  -27   -2   -6  -10  -32  -13  -12  -27  -30  -38  -29
119
StarCub

Disons que les données sont dans le fichier data.txt, Vous pouvez utiliser l'argument colClasses de read.table() pour ignorer les colonnes. Ici, les données dans les 7 premières colonnes sont "integer" Et nous définissons les 6 colonnes restantes sur "NULL", Indiquant qu’elles doivent être ignorées.

> read.table("data.txt", colClasses = c(rep("integer", 7), rep("NULL", 6)), 
+            header = TRUE)
  Year Jan Feb Mar Apr May Jun
1 2009 -41 -27 -25 -31 -31 -39
2 2010 -41 -27 -25 -31 -31 -39
3 2011 -21 -27  -2  -6 -10 -32

Remplacez "integer" Par l'un des types acceptés, comme indiqué dans ?read.table, En fonction du type de données réel.

data.txt Ressemble à ceci:

$ cat data.txt 
"Year" "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
2009 -41 -27 -25 -31 -31 -39 -25 -15 -30 -27 -21 -25
2010 -41 -27 -25 -31 -31 -39 -25 -15 -30 -27 -21 -25
2011 -21 -27 -2 -6 -10 -32 -13 -12 -27 -30 -38 -29

et a été créé en utilisant

write.table(dat, file = "data.txt", row.names = FALSE)

dat est

dat <- structure(list(Year = 2009:2011, Jan = c(-41L, -41L, -21L), Feb = c(-27L, 
-27L, -27L), Mar = c(-25L, -25L, -2L), Apr = c(-31L, -31L, -6L
), May = c(-31L, -31L, -10L), Jun = c(-39L, -39L, -32L), Jul = c(-25L, 
-25L, -13L), Aug = c(-15L, -15L, -12L), Sep = c(-30L, -30L, -27L
), Oct = c(-27L, -27L, -30L), Nov = c(-21L, -21L, -38L), Dec = c(-25L, 
-25L, -29L)), .Names = c("Year", "Jan", "Feb", "Mar", "Apr", 
"May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"), class = "data.frame",
row.names = c(NA, -3L))

Si le nombre de colonnes n'est pas connu au préalable, la fonction utilitaire count.fields Lira le fichier et comptera le nombre de champs de chaque ligne.

## returns a vector equal to the number of lines in the file
count.fields("data.txt", sep = "\t")
## returns the maximum to set colClasses
max(count.fields("data.txt", sep = "\t"))
153
Gavin Simpson

Pour lire un ensemble spécifique de colonnes d’un ensemble de données, il existe plusieurs autres options:

1) Avec fread depuis le package data.table:

Vous pouvez spécifier les colonnes désirées avec le paramètre select de fread du package data.table. Vous pouvez spécifier les colonnes avec un vecteur de noms de colonnes ou de numéros de colonnes.

Pour l'exemple de jeu de données:

library(data.table)
dat <- fread("data.txt", select = c("Year","Jan","Feb","Mar","Apr","May","Jun"))
dat <- fread("data.txt", select = c(1:7))

Sinon, vous pouvez utiliser le paramètre drop pour indiquer quelles colonnes ne doivent pas être lues:

dat <- fread("data.txt", drop = c("Jul","Aug","Sep","Oct","Nov","Dec"))
dat <- fread("data.txt", drop = c(8:13))

Tous résultent en:

> data
  Year Jan Feb Mar Apr May Jun
1 2009 -41 -27 -25 -31 -31 -39
2 2010 -41 -27 -25 -31 -31 -39
3 2011 -21 -27  -2  -6 -10 -32

UPDATE: Lorsque vous ne voulez pas que fread renvoie un data () = , utilisez le paramètre data.table = FALSE, par exemple: fread("data.txt", select = c(1:7), data.table = FALSE)

2) Avec read.csv.sql Du package sqldf-:

Une autre alternative est la fonction read.csv.sql Du paquetage sqldf:

library(sqldf)
dat <- read.csv.sql("data.txt",
                    sql = "select Year,Jan,Feb,Mar,Apr,May,Jun from file",
                    sep = "\t")

3) Avec les fonctions read_* Du package readr-:

library(readr)
dat <- read_table("data.txt",
                  col_types = cols_only(Year = 'i', Jan = 'i', Feb = 'i', Mar = 'i',
                                        Apr = 'i', May = 'i', Jun = 'i'))
dat <- read_table("data.txt",
                  col_types = list(Jul = col_skip(), Aug = col_skip(), Sep = col_skip(),
                                   Oct = col_skip(), Nov = col_skip(), Dec = col_skip()))
dat <- read_table("data.txt", col_types = 'iiiiiii______')

Dans la documentation, une explication des caractères utilisés avec col_types:

chaque caractère représente une colonne: c = caractère, i = entier, n = nombre, d = double, l = logique, D = date, T = heure, t = heure,? = devine, ou _/- pour sauter la colonne

61
Jaap

Vous pouvez également utiliser JDBC pour y parvenir. Créons un exemple de fichier csv.

write.table(x=mtcars, file="mtcars.csv", sep=",", row.names=F, col.names=T) # create example csv file

Téléchargez et enregistrez le pilote JDBC CSV à partir de ce lien: http://sourceforge.net/projects/csvjdbc/files/latest/download

> library(RJDBC)

> path.to.jdbc.driver <- "jdbc//csvjdbc-1.0-18.jar"
> drv <- JDBC("org.relique.jdbc.csv.CsvDriver", path.to.jdbc.driver)
> conn <- dbConnect(drv, sprintf("jdbc:relique:csv:%s", getwd()))

> head(dbGetQuery(conn, "select * from mtcars"), 3)
   mpg cyl disp  hp drat    wt  qsec vs am gear carb
1   21   6  160 110  3.9  2.62 16.46  0  1    4    4
2   21   6  160 110  3.9 2.875 17.02  0  1    4    4
3 22.8   4  108  93 3.85  2.32 18.61  1  1    4    1

> head(dbGetQuery(conn, "select mpg, gear from mtcars"), 3)
   MPG GEAR
1   21    4
2   21    4
3 22.8    4
7
Rahul Premraj

Un moyen facile:

data <- read.table("dataname.csv", header = TRUE, sep = ",")[,1:7] 
0
StatisAGV