3
votes

Créer une nouvelle colonne qui est un vecteur d'autres colonnes

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!


0 commentaires

3 Réponses :


3
votes

Vous pouvez le faire avec la fonction map2 de purrr :

library(dplyr)
library(purrr)

IDs %>% 
  mutate(together = map2(V1, V2, ~c(.x, .y)))


1 commentaires

Merci pour la réponse!



2
votes

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


5 commentaires

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 :)



3
votes

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


0 commentaires