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).
3 Réponses :
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
.
vous pouvez vous en tirer avec cbind (df [1], a)
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.
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.
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)