Home Forum Statistica con R Identificativo in read.csv

This topic contains 12 replies and has 3 voices.

Viewing 13 posts - 1 through 13 (of 13 total)
  • Author
    Posts
  • #5543

    massimo.trupia
    Participant

    Buonasera a tutti.
    Nel comando read.xlsx() specificando all’interno sheet=1 indico che la prima colonna contiene l’identificativo. Con il comando read.csv non trovo il comando corrispondente per identificare l’ID. Sapreste aiutarmi?

    #5544

    Ciao massimo!
    come puoi leggere da questo link, l’argomento sheet non indica che la prima colonna del dataset contiene l’ID dei soggetti.
    Potendo un file excel contenere più di un foglio, sheet ti permette di selezionare quale foglio importare.

    Mettiamo di avere un file .xlsx contenente un dataset di cani e uno di gatti:

    foglio cani:
    fogio cani

    foglio gatti:
    foglio gatti

    
    lib <- c("tidyverse", "openxlsx")
    lapply(lib, require, character.only = TRUE)
    rm(lib)
    
    # importo df cani e gatti specificando il numero di foglio
    df_cani <- read.xlsx("fogli_dfs.xlsx", sheet = 1)
    df_gatti <- read.xlsx("fogli_dfs.xlsx", sheet = 2)
    
    df_cani
    
    ID  cani
    1 bobby
    2 lucky
    3 chuck
    
    df_gatti
    
    ID gatti
    1  nimo
    2   ben
    3  lust
    
    # la prima colonna ID è una variabile 'double' ovvero numerica
    glimpse(df_cani)
    
    Observations: 3
    Variables: 2
    $ ID   <dbl> 1, 2, 3
    $ cani <chr> "bobby", "lucky", "chuck"
    

    Per quanto riguarda l’utilizzo della funzione read.csv(), quando importi il file, la colonna degli identificativi penso venga letta come una semplice variabile (numerica, e.g. 1,2,3,4 etc.). Se invece volessi chiedere a read.csv() di trattare la variabile ID come nome delle righe/osservazioni, allora ti consiglio di guardare l’argomento row.names, che ti permette – specificando un singolo valore numerico, e.g. 1 – di indicare quale sia la colonna del tuo dataset che vuoi venga identificata come nomi di riga.

    Mettiamo di avere un altro file .csv con un differente dataset di cani:
    df csv cani

    
    # importo il file con read.csv
    df <- read.csv("/Users/francesco/Desktop/animals/df.csv", stringsAsFactors = FALSE)
    
    # la prima colonna è sempre una variabile numerica di identificativi
    glimpse(df)
    
    Observations: 3
    Variables: 2
    $ ID   <chr> "id_1", "id_2", "id_3"
    $ cani <chr> "bobby", "lucky", "neam"
    
    # reimporto df ma specificando che la prima colonna diventi i numeri di riga del dataset
    df <- read.csv("/Users/francesco/Desktop/animals/df.csv", row.names = 1, stringsAsFactors = FALSE)
    
    # la colonna degli ID è scomparsa
    glimpse(df)
    
    Observations: 3
    Variables: 1
    $ cani <chr> "bobby", "lucky", "neam"
    
    # ma è diventata i nomi delle righe
    df
    
          cani
    id_1 bobby
    id_2 lucky
    id_3  neam
    

    Ho risposto alla tua domanda?

    #5545
    Davide Massidda
    Davide Massidda
    Moderator

    Ciao, in realtà credo che non sia proprio così. Con sheet = 1 stai dicendo al comando di importare i dati dal primo dei fogli di lavoro disponibili. Penso che dovresti utilizzare rowNames = TRUE per fare quello che serve a te.

    #5546

    massimo.trupia
    Participant

    Intanto vi ringrazio per la celere risposta!
    Si, è assolutamente come dite voi su sheet. Evidentemente è un problema di conversione il mio. La mio colonna ID contiene 13 cifre e nella trasformazione in CSV ed importazione in R subisce una trasformazione facendo diventare 0 in automatico gli ultimi numeri (non so il perché). Quando uso il comando read.xlsx il problema non si pone.
    Il problema però legato al read.xlsx è che ogni volta che provo a caricare un secondo database mi da il seguente errore –> Error in read.xlsx.default(db) : std::bad_alloc.

    Questi sono i pacchetti precedentemente caricati
    options(java.parameters = “-Xmx30g” )
    library(rJava)
    library(xlsx)
    library(readxl)
    library(gdata)
    library(openxlsx)

    Per quanto riguarda la gestione in read.csv2 quando lancio
    > db=file.choose()
    > STIMA14=read.csv2(db, row.names=1)
    da questo errore:
    –> Error in read.table(file = file, header = header, sep = sep, quote = quote, :
    duplicate ‘row.names’ are not allowed

    #5547

    Ciao massimo,
    parto da questo errore:

    Error in read.table(file = file, header = header, sep = sep, quote = quote, :
    duplicate ‘row.names’ are not allowed

    Sembra come se R pensi che tu voglia assegnare il nome “1″ a tutte le righe del tuo dataset (in pratica quell’1 non viene interpretato come il numero della colonna da assegnare come nomi di riga); forse c’è stato un errore di importazione del file. Come si legge nell’help l’argomento row.names può identificare diverse cose: “a vector of row names. This can be a vector giving the actual row names, or a single number giving the column of the table which contains the row names, or character string giving the name of the table column containing the row names.”
    In pratica nel tuo caso R sta utilizzando il primo caso, prendendo quell’1 che gli dai come “actual row names”.

    Per quanto riguarda invece Error in read.xlsx.default(db) : std::bad_alloc., potresti postare i comandi che lanci che producono tale errore? (e magari anche i comandi che invece vanno a buon fine)

    #5548

    massimo.trupia
    Participant

    Per`l’errore Error in read.xlsx.default(db) : std::bad_alloc., carico prima un dataset in tal modo
    >db=file.choose()
    >DB1=read.xlsx(db,sheet=1)
    ed è tutto ok.
    Appena carico il secondo invece da l’errore
    >db=file.choose()
    >DB2=read.xlsx(db,sheet=1)

    #5549

    é strano che il codice sia identico ma la seconda volta che lo provi ti dia quell’errore. Il problema forse allora potrebbe essere nel secondo file.
    Quante righe e colonne ha il secondo file? Potrebbe essere un file troppo grande e read.xlsx non riesce a gestirlo in termini di memoria.

    #5550
    Davide Massidda
    Davide Massidda
    Moderator

    Potrebbe essere un file troppo grande e read.xlsx non riesce a gestirlo in termini di memoria.
    Anche io propendo per questa soluzione, è capitato pure a me di non riuscire a importare direttamente degli Excel a causa di problemi di gestione di memoria.

    #5551

    massimo.trupia
    Participant

    Ho 420000 righe per 20 colonne in entrambi i dataset. Rimane comunque strano che una prima volta lo legga e la seconda no.
    Per questo vorrei utilizzare il read.csv2 che carica più velocemente; ma continuo a non risolvere il problema sul progressivo di 13 numeri come ID. Non riesco a capire come indicargli che quella colonna è un testo.

    #5552

    OK, quindi è probabilmente troppo grande come file.
    Prova questo – adattandolo in base al file in formato .csv che hai – e dimmi se funziona (e se no che errore ti da):

    
    path = file.choose()
    df <- read.table(path, 
                     stringsAsFactors = FALSE,  # importa tutte variabili di testo come carattere non fattore
                     sep = ",",  # cambiare col separatore di colonna usato nella codifica del file.csv
                     header = TRUE,  # la prima riga del file identifica i nomi delle variabili
                     row.names = 1)  # la prima colonna del dataset diventa i nomi di riga
    
    #5556
    Davide Massidda
    Davide Massidda
    Moderator

    continuo a non risolvere il problema sul progressivo di 13 numeri come ID. Non riesco a capire come indicargli che quella colonna è un testo.

    Guarda, vado a memoria, ma secondo me read.csv2 non ha un’opzione che gli permette di prendere una colonna e di non considerarla come variabile ma come identificativo della riga. Io quindi importerei anche l’ID come una colonna qualsiasi, magari specificando a R che si tratta di testo (per questo c’è un’opzione colClasses) e successivamente la assegnerei ai nomi di riga.

    #5560

    massimo.trupia
    Participant

    Allora, dopo che lo lancio mi da questo errore

    Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, :
    la riga 2 non ha 5 elementi

    Ho provato senza le descrizioni stringsAsFactors, sep e header ma da lo stesso errore.

    Mi sa che per risolvere il problema utilizzerò un metodo un po’ artigianale come suggerito da Davide: carico il file in xlsx (purtroppo come già detto riesco a caricarlo in xlsx solo una volta ad area di lavoro), e poi gli associo con la funzione cbind il vettore dell’identificativo caricato in xlsx.
    Secondo voi c’è il rischio che R cambi l’ordinamento del dataset quando lo carico come csv? Sono quasi sicuro di no, ma vorrei conferma visto che lo ordino in funzione dell’ID che poi però sballa una volta che lo carico in csv.

    #5561

    massimo.trupia
    Participant

    Ho riprovato utilizzando al posto di read.table il comando read.csv2 e ha risolto finalmente il problema inserendo questi comandi

    > db=file.choose()
    > DB=read.csv2(db,stringsAsFactors = FALSE ,header = TRUE, row.names = 1 )

    Grazie mille!!

Viewing 13 posts - 1 through 13 (of 13 total)

You must be logged in to reply to this topic.