Home Forum Statistica con R Estrapolare dati da un dataset

This topic contains 14 replies and has 2 voices.

Viewing 15 posts - 1 through 15 (of 15 total)
  • Author
    Posts
  • #5568

    angelic
    Participant

    Ciao a tutti, ho un dataset simile a questo sotto riportato (in realtà ho 125 gruppi, ogni gruppo ha 80 valori al suo interno). Devo estrapolare dal dataset originale ogni singolo gruppo e farlo diventare o tabella o un nuovo dataset,è indifferente, perchè poi devo fare, per ogni singolo gruppo, delle analisi statistiche. Ho provato ad usare il comando data.frame ma non riesco a farlo girare. Chi mi può aiutare? grazie

    Gruppo c_9 c_6 c_7 c_5

    1 : 0,10 0,47 -0,03 0,01
    0,10 0,77 0,30 0,11
    0,00 0,57 0,13 0,20
    0,27 0,52 -0,44 0,05

    2 : -0,01 0,38 -0,24 0,10
    0,01 0,43 -0,25 0,06
    0,23 0,70 0,40 0,01
    0,38 0,84 -0,28 0,03

    3 : 0,01 0,54 -0,13 0,16
    0,16 0,46 -0,31 0,11
    0,24 0,55 -0,07 0,05
    0,13 0,57 -0,36 0,19

    4 : 0,11 0,39 -0,06 0,08
    0,14 0,51 -0,17 0,15
    0,29 0,76 0,28 0,10
    0,49 0,52 -0,20 0,16

    • This topic was modified 1 month, 3 weeks ago by  angelic.
    • This topic was modified 1 month, 3 weeks ago by  angelic.
    #5572

    Ciao angelic!
    il dataset originale è già importato in R?

    Se si potresti postare il risultato del comando str(nome_dataset)?

    Se no invece dove è salvato il dataset? In che tipo di file? come sono organizzati i dati all’interno del file (per esempio ogni colonna è un gruppo e ogni riga è un valore numerico)? Se fa potresti postare uno screenshot del dataset per capire come sono organizzati i dati?

    #5573

    angelic
    Participant

    Ciao Francesco,
    i dati sono su excel e li ho caricati su R, trovi il risultato del comando str, e ti allego la foto del dataset su R(anche se è difficile far entrare più di 2 gruppi nella foto perchè in ogni gruppo ho 80 righe)

    Classes ‘tbl_df’, ‘tbl’ and ‘data.frame’: 10121 obs. of 8 variables:
    $ Gruppi : num 1 NA NA NA NA NA NA NA NA NA …
    $ Colonna1: POSIXct, format: “1899-12-31 19:17:00″ “1899-12-31 19:17:15″ “1899-12-31 19:17:29″ “1899-12-31 19:17:44″ …
    $ time : num 1 2 3 4 5 6 7 8 9 10 …
    $ c_9 : num -0.0209 0.2827 -0.1145 0.3161 0.5699 …
    $ c_6 : num 0.416 0.622 0.279 0.593 0.62 …
    $ c_7 : num 0.10552 -0.08483 0.02121 0.00776 -0.08121 …
    $ c_5 : num 0.04879 0.14441 0.00634 0.00146 0.14977 …
    $ c_3 : num 0.054 -0.0135 -0.404 0.2374 0.2104 …

    Foto Dataset

    #5574

    angelic
    Participant

    Non so se si apre la foto, comunque nella variabile “Gruppi” ci sono molti NA perché su excel ho unito le righe che appartengono al gruppo corrispondente

    #5575

    Perfetto, quindi ogni gruppo c_N è codificato come una colonna del dataset che è già stato importato.

    Puoi estrapolare ogni gruppo trasformandolo in un dataframe nominato come il gruppo stesso facendo:

    
    # import libraries
    lib <- c("tidyverse")
    lapply(lib, require, character.only = TRUE)
    rm(lib)
    
    # mettiamo di avere questo dataframe
    df <- tibble(gruppi=c(1, NA),
                 c_9=c('miao', 'bau'), 
                 c_3=c('totti', 'ciotti'))
    
    df
    # A tibble: 2 x 3
      gruppi c_9   c_3   
       <dbl> <chr> <chr> 
    1   1.00 miao  totti 
    2  NA    bau   ciotti
    

    tibble() all’interno del pacchetto tidyverse è un’alternativa ai classici dataframe. Puoi leggere i vantaggi qui.

    
    # estrai le colonne dei gruppi e salvali come oggetti indipendenti nel workspace
    for (cols in colnames(select(df, c_9:c_3))) {  # significa prendi le colonne che vanno da c_9 a c_3
                                                   # in alternativa  se in mezzo ai gruppi ci sono variabili che non si vogliono estrarre
                                                   # si possono mettere i nomi di colonna separati da virgola: select(df, c_9, c_3, c_8)
                                                   # oppure: select(df, c_9:c_3, c_7, c_8:c_11) 
     assign(cols, select(df, cols))
    }
    
    rm(cols)
    

    quindi ottieni singoli dataframe:

    
    c_9
    # A tibble: 2 x 1
      c_1  
      <chr>
    1 miao 
    2 bau  
    
    c_3
    # A tibble: 2 x 1
      c_2   
      <chr> 
    1 totti 
    2 ciotti
    
    #5576

    angelic
    Participant

    Perfetto grazie mille, ora provo il codice, ovviamente io in questo codice
    df <- tibble(gruppi=c(1, NA),
    c_9=c(‘miao’, ‘bau’),
    c_3=c(‘totti’, ‘ciotti’))

    dentro c_9=c(‘miao’, ‘bau’), scriverò al posto di miao dataset$c_9?

    #5577

    No quella parte li non c’è bisogno di includerla. Ho creato il dataframe df solo per avere un dataframe per fare un esempio.
    Puoi utilizzare solo la seconda parte della mia risposta (da # estrai le colonne etc) sostituendo df con il nome del dataset originale in R, e sostituendo la parte dove specifichi quali colonne del dataset originale vuoi considerare (select(nome_dataset, c_N:c_N))

    Per intenderci, usa solo questa parte sostituendo dove serve:

    
    for (cols in colnames(select(nome_dataset, c_N:c_N))) {  
     assign(cols, select(nome_dataset, cols))
    }
    
    rm(cols)
    
    #5579

    angelic
    Participant

    uhmmmm non mi gira,stavo rivedendo il codice e ho notato che cosi io estraggo le singole colonne, io invece ho la necessità di estrarre 80 righe dal dataset per tutte le colonne insieme. Ti allego la foto del risultato di cui ho bisogno che ieri avevo iniziato a fare a mano, ma quando ho visto che avevo 125 gruppi ho preferito trovare una soluzione più rapida

    Risultato Dataset

    #5580

    Purtroppo non riesco a visualizzare nessuno degli screenshot che hai caricato.
    In ogni caso per selezionare ogni riga e trasformarla in un dataframe puoi seguire questo procedimento:

    
    # importo librerie
    lib <- c("tidyverse")
    lapply(lib, require, character.only = TRUE)
    rm(lib)
    
    # riprendendo l'esempio sopra creo un dataframe di esempio
    df <- tibble(gruppi=c(1, NA),
                 c_9=c('miao', 'bau'), 
                 c_3=c('totti', 'ciotti'))
    
    # seleziona solo le colonne interessate
    # se tutte le colonne sono utili si può saltare questo passaggio
    sub_df <- df %>%
      select(c_9:c_3)
    
    # per ogni riga crea un dataframe
    for (i in 1:nrow(sub_df)) {
      assign(paste('df_', i, sep = ''),
             sub_df[i, ])
    }
    
    rm(i)
    
    # richiamo df_1
    df_1
    # A tibble: 1 x 2
      c_9   c_3  
      <chr> <chr>
    1 miao  totti
    

    oppure

    
    # PROCEDURA ALTERNATIVA
    # per evitare di avere il workspace pieno di singoli dataframe
    # questi potrebbero essere tutti inseriti all'interno di una lista
    lista_df <- list()
    for (i in 1:nrow(sub_df)) {
      lista_df[[paste('df_', i, sep = '')]] <- sub_df[i, ]
    }
    
    rm(i)
    
    # ora per accedere ad uno dei dataframe all'interno della lista:
    lista_df[[1]]
    # A tibble: 1 x 2
      c_9   c_3  
      <chr> <chr>
    1 miao  totti
    
    # oppure anche
    lista_df[['df_1']]
    # A tibble: 1 x 2
      c_9   c_3  
      <chr> <chr>
    1 miao  totti
    
    #5581

    angelic
    Participant

    scusami per l’estremo disturbo, ma non funziona proprio, vorrei caricarti l’immagine per farti capire bene il dataset. Come la carico? io clicco sul tasto IMG qui sopra lo spazio per scrivere e poi incollo il percorso del posizionamento della cartella prendendolo dalle proprietà del file.
    io scrivo

    library(readxl)
    data30 <- read_excel(“vo2.xlsx”, sheet = “ab30 “)
    View(data30)

    lista_df <- list()
    for (i in 1:125 ) {
    lista_df[[paste('df_', i, sep = '')]] <- sub_df[i, ]
    }

    rm(i)

    lista_df[[2]]

    se lancio il comando lista_df[[2]] mi dice che è vuoto.

    Io non so se mi sono spiegata bene sul mio obiettivo,cerco di farlo meglio.

    io ho 6 variabili in colonna: Gruppi, c_9 , c_6 , c_7 , c_5 , c_3, e poi ho 10000 righe.

    devo fare in modo che queste 10000 righe vengano raggruppate in 125 gruppi(80 righe per ogni gruppo).

    Ogni gruppo conterrà i valori delle 6 variabili. In fine farò una media per ogni variabile per ogni gruppo

    Il mio obiettivo è ottenere:
    Gruppo 1(dove ho le prime 80 righe del dataset):media c_9 ,media c_6 ,media c_7 ,media c_5 ,media c_3
    Gruppo 2: media c_9 ,media c_6 ,media c_7 ,media c_5 ,media c_3
    .
    .
    .
    .
    Gruppo 125: media c_9 ,media c_6 ,media c_7 ,media c_5 ,media c_3

    #5582

    angelic
    Participant

    Foto Dataset

    #5583

    angelic
    Participant

    Foto Dataset

    #5585

    Ciao angelic,
    prova con questo sito per caricare un immagine qui https://imggmi.com/:
    – clicchi nella prima barra bianca e scegli l’immagine dal tuo pc
    – clicchi su “upload now”
    – copi il “1. viewer links”
    – all’interno del post qui su insular, clicchi sul bottone “img” e poi incolli il “viewer links” (eventualmente ti chiede di scrivere una breve descrizione dell’immagine)

    #5587

    Prova anche questa soluzione in base alla tua ultima risposta:

    
    # import libraries
    lib <- c("tidyverse")
    lapply(lib, require, character.only = TRUE)
    rm(lib)
    
    lista_dfs <- nome_dataset %>% 
      # creo un variabile numerica per poter raggruppare il dataset in 125 gruppi da 80 righe ciascuno
      mutate(gruppi= rep(1:125, each=80)) %>%
      # raggruppo il dataset in 125 gruppi
      group_by(gruppi) %>%
      # seleziono solo la colonna gruppi e le colonne c_N del dataset 
      select(gruppi, contains('c_')) %>%
      # trasformo il dataset in una lista con dataset più piccoli basati sulla variabile gruppi (da 80 righe ciascuno)
      nest() %>%
      # elimino la variabile gruppi che non serve più
      select(data) %>%
      # semplifico la struttura della list
      unlist(recursive = FALSE)
    

    ora se guardo quanti dataframe ci sono dentro lista_dfs

    
    length(lista_dfs)
    [1] 125
    

    e per richiamare uno dei dataframe posso fare come mostrato anche sopra

    
    # usando l'indice dell'elemento all'interno della lista
    lista_dfs[[1]]
    # A tibble: 80 x 5
          c_9     c_6    c_7    c_5    c_3
        <dbl>   <dbl>  <dbl>  <dbl>  <dbl>
     1 0.0286 0.00648 0.0230 0.0625 0.924 
     2 0.969  0.992   0.356  0.173  0.335 
     3 0.215  0.678   0.624  0.856  0.0376
     4 0.217  0.196   0.433  0.802  0.823 
     5 0.884  0.104   0.815  0.137  0.211 
     6 0.667  0.211   0.959  0.887  0.783 
     7 0.222  0.127   0.648  0.701  0.0974
     8 0.371  0.924   0.262  0.279  0.583 
     9 0.105  0.760   0.614  0.0764 0.142 
    10 0.124  0.578   0.254  0.0893 0.904 
    # ... with 70 more rows
    
    # oppure usando il nome
    lista_dfs[['data1']]
    # A tibble: 80 x 5
          c_9     c_6    c_7    c_5    c_3
        <dbl>   <dbl>  <dbl>  <dbl>  <dbl>
     1 0.0286 0.00648 0.0230 0.0625 0.924 
     2 0.969  0.992   0.356  0.173  0.335 
     3 0.215  0.678   0.624  0.856  0.0376
     4 0.217  0.196   0.433  0.802  0.823 
     5 0.884  0.104   0.815  0.137  0.211 
     6 0.667  0.211   0.959  0.887  0.783 
     7 0.222  0.127   0.648  0.701  0.0974
     8 0.371  0.924   0.262  0.279  0.583 
     9 0.105  0.760   0.614  0.0764 0.142 
    10 0.124  0.578   0.254  0.0893 0.904 
    # ... with 70 more rows
    
    

    ora

    
    # per calcolare la media di ogni variabile in ognuno dei 125 dataframe
    lista_dfs_media <- lista_dfs %>%
      lapply(function(x) {
        x %>%
          # calcola la media di tutte le colonne che nel nome contengono la stringa 'c_'
          mutate_at(vars(contains('c_')), funs(mean(., na.rm = TRUE))) %>%
          # seleziona solo la prima riga
          slice(row_number() == 1)
      })
    
    #5588

    Tutto ciò che ho scritto vale nel caso in cui tu abbia bisogno per qualche motivo di avere i gruppi separati in tanti dataframe differenti.
    Ma se l’obiettivo è solo calcolare la media delle variabili c_9 a c_3 per ogni gruppo l’obiettivo si può raggiungere molto più velocemente così:

    
    df_medie <- nome_dataset %>%
      # creo un variabile numerica per poter raggruppare il dataset in 125 gruppi da 80 righe ciascuno
      # se la variabile gruppi esiste già non c'è bisogno di questo passaggio. L'ho creata solo perché la tua variabile Gruppi contiene degli NA
      mutate(gruppi= rep(1:125, each=80)) %>%
      # raggruppo il dataset in 125 gruppi
      group_by(gruppi) %>%
      # seleziono solo la colonna gruppi e le colonne c_N del dataset (nel caso esistano altre variabili che non servono)
      select(gruppi, contains('c_')) %>%
      # calcolo la media delle variabili da c_9 a c_3 per ogni gruppo
      summarize_at(vars(contains('c_')), funs(mean(., na.rm = TRUE))) 
    
Viewing 15 posts - 1 through 15 (of 15 total)

You must be logged in to reply to this topic.