2
votes

Lier le vecteur avec la liste des vecteurs en utilisant cbind

J'ai un data.frame original et je voudrais lancer lapply sur certaines colonnes puis cbind les colonnes restantes avec les résultats de l'opération lapply .

Voir le code ci-dessous. Je voudrais idéalement que b contienne la première colonne id du data.frame avec les résultats du lapply . Je suppose que mon erreur est que mon argument list pour cbind contient une liste de listes ... le premier argument de list est un vecteur qui pourrait être géré, mais le deuxième argument est une liste elle-même. Je me demande simplement comment gérer cela.

Merci!

df <- data.frame(id = 1:10,
                 colB = 11:20,
                 colC = 21:30)

a <- lapply(df[,2:3],
            function(x) {x = 10 * x}
)

b <- do.call(cbind,
             list(df[,1],
                  a))

Créé le 16/02/2019 par le package reprex (v0.2.0).


0 commentaires

3 Réponses :


1
votes

Vous ne pouvez cbind que deux data.frame s.

Donc, réécrire b comme:

b <- cbind(df[1], as.data.frame(a))

> b
   id colB colC
1   1  110  210
2   2  120  220
3   3  130  230
4   4  140  240
5   5  150  250
6   6  160  260
7   7  170  270
8   8  180  280
9   9  190  290
10 10  200  300

Notez que df [1] est utilisé pour conserver le statut de data.frame .


1 commentaires

vous pouvez vous en tirer avec cbind (df [1], a)



4
votes

La différence est subtile mais importante: pour que votre code fonctionne comme vous le souhaitez, vous avez besoin de

b
#   id colB colC
#1   1  110  210
#2   2  120  220
#3   3  130  230
#4   4  140  240
#5   5  150  250
#6   6  160  260
#7   7  170  270
#8   8  180  280
#9   9  190  290
#10 10  200  300

Result

b <- do.call(cbind, list(df[1], a))
#                        ^^^^^

Le la différence est que df [1] renvoie un data.frame tandis que df [ 1] renvoie un vecteur. cbind a une méthode pour data.frame s qui est ce que get est appelé dans le cas ci-dessus, mais pas dans votre cas.


2 commentaires

En général, do.call traitera un élément de liste qui est une liste de data.frames - (donc do.call (cbind, list (df1, list_of_dfs )) où list_of_dfs est une liste de dataframes; une liste de listes en essences - comme une série de dataframes? Si a contenait un tracé ou un autre objet, cela peut ne pas fonctionner. Dans avec le recul, j'ai peut-être trop simplifié mon exemple ... :)


@Prevost Oui et oui. Vous pourriez poser une nouvelle question qui inclut cette nouvelle exigence.



0
votes

Vous pouvez également utiliser bind_cols () du package dplyr , qui peut également fonctionner avec des listes.

bind_cols(id = df[, 1], a)

bind_cols () s'attend à ce que tous les arguments soient des blocs de données, des listes nommées ou des arguments nommés. C'est ainsi que vous devez écrire df [1] au lieu de df [ 1] également dans ce cas. Cependant, si vous nommez explicitement l'argument, df [ 1] fonctionnera également:

library(dplyr)
bind_cols(df[1], a)


0 commentaires