J'ai un dataframe avec deux colonnes (V1 et V2) et j'aimerais créer une autre colonne qui est un vecteur - via la fonction de combinaison: c () - en prenant comme arguments les autres colonnes.
Je suis en utilisant dplyr pour toutes les tâches, je voudrais donc l'utiliser également dans ce contexte.
J'ai essayé de créer la nouvelle colonne avec une fonction apply mais elle renvoie un vecteur avec toutes les lignes (pas rowwise), quelque chose qui me surprend, car avec d'autres fonctions cela fonctionne en ligne.
Je l'ai résolu en utilisant la fonction rowwise, mais comme ce n'est généralement pas aussi efficace, j'aimerais voir s'il y en a un autre option.
Voici la définition du dataframe:
print(as.data.frame(IDs)) V1 V2 together1 together2 1 1 6 1, 6, 1, 8, 6, 8 1, 6 2 1 8 1, 6, 1, 8, 6, 8 1, 8 3 6 8 1, 6, 1, 8, 6, 8 6, 8
Voici la création des colonnes (ensemble1 est le mauvais résultat, et ensemble2 le bon) :
IDs <- IDs %>% mutate(together1 = list(mapply(function (x,y) c(x,y), V1, V2)) ) %>% rowwise() %>% mutate(together2 = list(mapply(function (x,y) c(x,y), V1, V2)) ) %>% ungroup()
Voici les résultats imprimés:
IDs <- structure(list(V1 = c("1", "1", "6"), V2 = c("6", "8", "8")), class = "data.frame", row.names = c(NA, -3L) )
Merci d'avance!
3 Réponses :
Vous pouvez le faire avec la fonction map2
de purrr
:
library(dplyr) library(purrr) IDs %>% mutate(together = map2(V1, V2, ~c(.x, .y)))
Merci pour la réponse!
Vous venez de manquer le SIMPLIFY = FALSE
dans votre appel mapply ()
:
dplyr::mutate(IDs, togeher = mapply(c, V1, V2, SIMPLIFY = F)) V1 V2 togeher 1 1 6 1, 6 2 1 8 1, 8 3 6 8 6, 8
Pourquoi sapply (V1, c, V2, simplify = FALSE) ou lapply (V1, c, V2) ne fonctionne-t-il pas?
Essayez de penser comme un lapply ()
:) Pour chaque entrée de V1
, il faut tout V2
et les concaténer, comme c ( V1 [i], V2)
pour tous les i
de 1: length (V1)
.
Merci, vous avez tout à fait raison. Mais une autre question: pourquoi utiliser SIMPLIFY = F? avec mapply (c, V1, V2) vous calculez simplement c (V1 [i], V2 [i])
Oui, mais avec SIMPLIFY = T
il renvoie matrice
. Si vous essayez d'exécuter le même code avec SIMPLIFY = T
, ce sera via l'erreur Column togeher doit être de longueur 3 (le nombre de lignes) ou un, pas 6
qui est probablement parce que la matrice est vue comme un vecteur par dplyr
. Je ne suis pas sûr de comprendre ce qui se passe sous le capot dans ce cas particulier.
Merci beaucoup pour votre explication :)
pmap
peut être utilisé ici
library(tidyverse) IDs %>% mutate(together = pmap(unname(.), c)) # V1 V2 together #1 1 6 1, 6 #2 1 8 1, 8 #3 6 8 6, 8