Quelle est la manière la plus concise et/ou élégante de transformer un vecteur en une trame de données à une seule ligne dans R ? J'essaie d'utiliser une fonction qui renvoie un vecteur à 5 éléments et de l'appliquer à tous les groupes de mon bloc de données, comme ceci :
library(tidyverse)
mtcars %>%
group_by(cyl) %>%
group_map(~boxplot.stats(.$wt)$stats)
J'aimerais avoir ces résultats sous forme de lignes dans un nouveau bloc de données, plutôt qu'une liste de vecteurs, afin que je puisse tracer avec eux dans ggplot. Mais le mieux que j'ai trouvé est d'ajouter do.call(rbind, .) %>% as.data.frame
à la fin de mon pipeline, ce qui semble disgracieux et inélégant. Remplacer le group_map
par un group_modify
semble être la réponse, mais la fonction se plaint que mes résultats ne sont pas une trame de données. Et envelopper la fonction anonyme dans un appel à tibble_row
ne fonctionne pas car tibble_row
ne prend pas de vecteurs, juste des éléments individuels ou des colonnes de liste explicites.
Idéalement, la sortie ressemblerait à :
cyl V1 V2 V3 V4 V5
1 4 1.513 1.8850 2.200 2.6225 3.19
2 6 2.620 2.8225 3.215 3.4400 3.46
3 8 3.170 3.5200 3.755 4.0700 4.07
Il y a sûrement une façon plus élégante de faire ce que j'essaie de faire, idéalement dans le cadre de tidyverse ?
Nous pourrions utiliser unnest_wider
après avoir renvoyé la sortie dans un list
insummarise
library(dplyr)
library(tidyr)
mtcars %>%
group_by(cyl) %>%
summarise(out = list(boxplot.stats(wt)$stats)) %>%
unnest_wider(out) %>%
rename_at(-1, ~ str_replace(., '\\.+', 'x'))
# A tibble: 3 x 6
# cyl x1 x2 x3 x4 x5
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 4 1.51 1.88 2.2 2.62 3.19
#2 6 2.62 2.82 3.22 3.44 3.46
#3 8 3.17 3.52 3.76 4.07 4.07
Ou si nous voulons utiliser la méthode de l'OP, définissez les noms pour cela vector
et utilisezas_tibble_row
library(purrr)
library(stringr)
mtcars %>%
group_by(cyl) %>%
group_map(~ tibble(cyl = first(.x$cyl),
setNames(boxplot.stats(.$wt)$stats, str_c('x', 1:5)) %>%
as_tibble_row) , .keep = TRUE) %>%
bind_rows
# A tibble: 3 x 6
# cyl x1 x2 x3 x4 x5
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 4 1.51 1.88 2.2 2.62 3.19
#2 6 2.62 2.82 3.22 3.44 3.46
#3 8 3.17 3.52 3.76 4.07 4.07
Comme la sortie de group_map
est toujours un list
, il peut être préférable d'utiliser group_modify
pour renvoyer un tbl
évitant ainsi le derniermap_dfr/bind_rows
mtcars %>%
group_by(cyl) %>%
group_modify(~ setNames(boxplot.stats(.$wt)$stats, str_c('x', 1:5)) %>%
as_tibble_row , .keep = TRUE) %>%
ungroup
# A tibble: 3 x 6
# cyl x1 x2 x3 x4 x5
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 4 1.51 1.88 2.2 2.62 3.19
#2 6 2.62 2.82 3.22 3.44 3.46
#3 8 3.17 3.52 3.76 4.07 4.07
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots