R Appliquer () la fonction sur des colonnes de données spécifiques

Je souhaite utiliser la fonction apply sur un dataframe, mais uniquement appliquer la fonction aux 5 dernières colonnes.

B<- by(wifi,(wifi$Room),FUN=function(y){apply(y, 2, A)}) 

Ceci applique A à toutes les colonnes de y

 B<- by(wifi,(wifi$Room),FUN=function(y){apply(y[4:9], 2, A)}) 

Ceci applique A uniquement aux colonnes 4-9 de y, mais le retour total de B supprime les 3 premières colonnes … Je les veux toujours, je ne veux pas que A leur soit appliqué.

 wifi[,1:3]+B 

aussi ne fait pas ce que j’attendais / voulait.

En utilisant un exemple data.frame et la fonction exemple (juste +1 à toutes les valeurs)

 A <- function(x) x + 1 wifi <- data.frame(replicate(9,1:4)) wifi # X1 X2 X3 X4 X5 X6 X7 X8 X9 #1 1 1 1 1 1 1 1 1 1 #2 2 2 2 2 2 2 2 2 2 #3 3 3 3 3 3 3 3 3 3 #4 4 4 4 4 4 4 4 4 4 data.frame(wifi[1:3], apply(wifi[4:9],2, A) ) #or cbind(wifi[1:3], apply(wifi[4:9],2, A) ) # X1 X2 X3 X4 X5 X6 X7 X8 X9 #1 1 1 1 2 2 2 2 2 2 #2 2 2 2 3 3 3 3 3 3 #3 3 3 3 4 4 4 4 4 4 #4 4 4 4 5 5 5 5 5 5 

Ou même:

 data.frame(wifi[1:3], lapply(wifi[4:9], A) ) #or cbind(wifi[1:3], lapply(wifi[4:9], A) ) # X1 X2 X3 X4 X5 X6 X7 X8 X9 #1 1 1 1 2 2 2 2 2 2 #2 2 2 2 3 3 3 3 3 3 #3 3 3 3 4 4 4 4 4 4 #4 4 4 4 5 5 5 5 5 5 

lapply est probablement un meilleur choix lapply ici, puisque apply coince d’abord votre data.frame sur un tableau, ce qui signifie que toutes les colonnes doivent avoir le même type. Selon votre contexte, cela pourrait avoir des conséquences imprévues.

Le modèle est le suivant:

 df[cols] <- lapply(df[cols], FUN) 

Le vecteur "cols" peut être un nom de variable ou un index. Je préfère utiliser des noms chaque fois que possible (il est robuste pour la réorganisation des colonnes). Donc, dans votre cas, cela pourrait être:

 wifi[4:9] <- lapply(wifi[4:9], A) 

Un exemple d'utilisation de noms de colonne:

 wifi <- data.frame(A=1:4, B=runif(4), C=5:9) wifi[c("B", "C")] <- lapply(wifi[c("B", "C")], function(x) -1 * x) 

Je pense que ce que vous voulez est mapply. Vous pouvez appliquer la fonction à toutes les colonnes, puis simplement déposer les colonnes que vous ne voulez pas. Cependant, si vous appliquez différentes fonctions à différentes colonnes, il semble probable que vous souhaitiez muter , à partir du package dplyr.

Comme mentionné, vous voulez simplement que la fonction standard d’ apply R soit appliquée aux colonnes ( MARGIN=2 ):

 wifi[,4:9] <- apply(wifi[,4:9], MARGIN=2, FUN=A) 

Ou, en bref:

 wifi[,4:9] <- apply(wifi[,4:9], 2, A) 

Cela met à jour les colonnes 4: 9 en place en utilisant la fonction A() . Maintenant, supposons que na.rm est un argument pour A() , ce qui devrait probablement être le cas. Nous pouvons passer à na.rm=T pour supprimer les valeurs NA du calcul comme na.rm=T :

 wifi[,4:9] <- apply(wifi[,4:9], MARGIN=2, FUN=A, na.rm=T) 

La même chose est vraie pour tous les autres arguments que vous souhaitez transmettre à votre fonction personnalisée.