La differenza tra Map () e map () dal pacchetto Purrr in R

Oct 05 2020

ciao stavo cercando di aggiungere una colonna del nome in tutti gli elementi della mia lista usando i nomi della lista. Cioè ho 8 tabelle nella mia lista, ogni tabella ha il proprio nome tabella 1 ... 8. Quindi in seguito posso toglierli dall'elenco e distinguere da dove proviene la tabella.

Ho letto questo post e il codice funziona. R - Aggiungi colonne ai dataframe nell'elenco scorrendo gli elementi in un vettore

my_list <- Map(cbind, mylist, Cluster = names(mylist))

Tuttavia, non capisco abbastanza il Map (). Questa non è la map () dal pacchetto Purrr, giusto? map () prenderà gli argomenti nell'ordine map (data, function). Ho controllato nella guida di Rstudio su Map, sembra più confuso. E se devo usare la funzione mappa Purrr, ho provato questo

my_list2 <- map(mylist, function(x)cbind(x,Cluster = names(x)))

non ha funzionato. qualcuno potrebbe spiegarmi come funziona Map e se userò map (), quali sono i cambiamenti che dovrei fare?

Risposte

4 ChuckP Oct 04 2020 at 23:30

Sono davvero funzioni diverse. Se la tua lista è già nominata, puoi certamente usare purrr::mapper aggiungere una colonna con nome. Consulta questa domanda recente poiché non hai fornito alcuna specifica.

La migliore ipotesi su quello che vuoi è:

purrr::map2(mylist, names(mylist), ~ mutate(.x, new_column_name = .y))
3 stefan Oct 04 2020 at 23:32

Forse questo è quello che stai cercando. Per aggiungere una colonna con il nome della lista devi scorrere sia la lista che i nomi. Questo potrebbe essere facilmente ottenuto tramite il purrr::imapquale è un wrapper purrr::map2o puoi usare la base Map. La differenza principale è probabilmente che nella Mapfunzione da applicare è il primo argomento. Inoltre, la purrrfamiglia di mapfunzioni consente di utilizzare la notazione delle formule (vedere l'esempio nel mio codice) per scrivere funzioni anonime

mylist <- list(
  a = data.frame(x = 1 , y = 2),
  b = data.frame(x = 3, y = 4)
)

purrr::imap(mylist, ~ cbind(.x, Cluster = .y))
#> $a #> x y Cluster #> 1 1 2 a #> #> $b
#>   x y Cluster
#> 1 3 4       b

Map(function(x, y) { cbind(x, Cluster = y) }, mylist, names(mylist))
#> $a #> x y Cluster #> 1 1 2 a #> #> $b
#>   x y Cluster
#> 1 3 4       b