R Apply() functie op specifieke dataframe kolommen

Ik wil de functie toepassen op een dataframe gebruiken, maar alleen de functie toepassen op de laatste 5 kolommen.

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

Dit past A toe op alle kolommen van y

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

Dit past A alleen toe op kolommen 4-9 van y, maar het totale rendement van B haalt de eerste 3 kolommen weg… Die wil ik nog steeds, ik wil alleen niet dat A erop wordt toegepast.

wifi[,1:3]+B 

doet ook niet wat ik verwachtte/wilde.


Antwoord 1, autoriteit 100%

lapplyis waarschijnlijk een betere keuze dan applyhier, omdat eerst toepassen je data.frame dwingt op een array, wat betekent dat alle kolommen hetzelfde type moeten hebben. Afhankelijk van uw context kan dit onbedoelde gevolgen hebben.

Het patroon is:

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

De ‘cols’-vector kunnen namen van variabelen of indices zijn. Ik geef er de voorkeur aan namen te gebruiken waar mogelijk (het is robuust voor het opnieuw ordenen van kolommen). Dus in jouw geval zou dit kunnen zijn:

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

Een voorbeeld van het gebruik van kolomnamen:

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

Antwoord 2, autoriteit 61%

Een voorbeeld data.frame en voorbeeldfunctie gebruiken (alleen +1 voor alle waarden)

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

Of zelfs:

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

Antwoord 3

Zoals vermeld, wilt u gewoon dat de standaard R apply-functie wordt toegepast op kolommen (MARGIN=2):

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

Of, in het kort:

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

Hiermee worden kolommen 4:9 op hun plaats bijgewerkt met behulp van de functie A(). Laten we nu aannemen dat na.rmeen argument is voor A(), wat het waarschijnlijk zou moeten zijn. We kunnen na.rm=Tdoorgeven om NA-waarden als volgt uit de berekening te verwijderen:

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

Hetzelfde geldt voor alle andere argumenten die u aan uw aangepaste functie wilt doorgeven.


4

Ik denk dat wat je wilt is monthly. U kunt de functie toepassen op alle kolommen en laat vervolgens de kolommen laten vallen die u niet wilt. Als u echter verschillende functies op verschillende kolommen aanbrengt, lijkt het waarschijnlijk wat u wilt is mutate , van het DLEYR-pakket.

Other episodes