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)