Voorbeelden van “vervangen” functies

Ik vind de helppagina voor de functie replaceuit het base-pakket niet erg nuttig. Het ergste is dat er geen voorbeelden zijn die kunnen helpen begrijpen hoe het werkt.

Kunt u alstublieft uitleggen hoe u het moet gebruiken? Een paar voorbeelden zou geweldig zijn.


Antwoord 1, autoriteit 100%

Als je naar de functie kijkt (door de naam ervan in de console te typen), zul je zien dat het slechts een eenvoudige gefunctionaliseerde versie is van de functie [<-die wordt beschreven in ?"[". [is een vrij basale functie voor R, dus je zou er goed aan doen om die pagina te bekijken voor meer details. Vooral belangrijk is te leren dat het indexargument (het tweede argument in replacekan logische, numerieke of tekengeclassificeerde waarden zijn. Recycling vindt plaats wanneer er verschillende lengtes zijn van het tweede en derde argument:

U moet de functieaanroep “lezen” als” “gebruik binnen het eerste argument het tweede argument als een index om de waarden van het derde argument in het eerste te plaatsen”:

> replace( 1:20, 10:15, 1:2)
 [1]  1  2  3  4  5  6  7  8  9  1  2  1  2  1  2 16 17 18 19 20

Tekenindexering voor een benoemde vector:

> replace(c(a=1, b=2, c=3, d=4), "b", 10)
 a  b  c  d 
 1 10  3  4 

Logische indexering:

> replace(x <- c(a=1, b=2, c=3, d=4), x>2, 10)
 a  b  c  d 
 1  2 10 10 

Antwoord 2, autoriteit 33%

U kunt ook logische tests gebruiken

x <- data.frame(a = c(0,1,2,NA), b = c(0,NA,1,2), c = c(NA, 0, 1, 2)) 
x
x$a <- replace(x$a, is.na(x$a), 0)
x
x$b <- replace(x$b, x$b==2, 333)

Antwoord 3, autoriteit 28%

Hier zijn twee eenvoudige voorbeelden

> x <- letters[1:4]
> replace(x, 3, 'Z') #replacing 'c' by 'Z'
[1] "a" "b" "Z" "d"
> 
> y <- 1:10
> replace(y, c(4,5), c(20,30)) # replacing 4th and 5th elements by 20 and 30
 [1]  1  2  3 20 30  6  7  8  9 10

Antwoord 4, autoriteit 7%

Houd er rekening mee dat de derde parameter (waarde) in de bovenstaande voorbeelden: de waarde een constante is (bijvoorbeeld ‘Z’ of c(20,30)).

Het definiëren van de derde parameter met behulp van waarden uit het dataframe zelf kan tot verwarring leiden.

Bijvoorbeeld met een eenvoudig dataframe zoals dit (met dplyr::data_frame):

tmp <- data_frame(a=1:10, b=sample(LETTERS[24:26], 10, replace=T))

Dit zal zoiets als dit creëren:

      a     b
   (int) (chr)
1      1     X
2      2     Y
3      3     Y
4      4     X
5      5     Z

..etc

Stel nu dat u de waarden in kolom ‘a’ met 2 wilt vermenigvuldigen, maar alleen waar kolom ‘b’ “X” is. Mijn onmiddellijke gedachte zou zoiets zijn als dit:

with(tmp, replace(a, b=="X", a*2))

Dat zal echter niet het gewenste resultaat opleveren. De a*2 wordt gedefinieerd als een vaste vector in plaats van een verwijzing naar de ‘a’-kolom. De vector ‘a*2’ wordt dus

[1]  2  4  6  8 10 12 14 16 18 20

aan het begin van de bewerking ‘vervangen’. Dus de eerste rij waar ‘b’ gelijk is aan “X”, de waarde in ‘a’ wordt geplaatst door 2. De tweede keer wordt deze vervangen door 4, enz … deze wordt niet vervangen door twee keer -de-waarde-van-a in die specifieke rij.


Antwoord 5, autoriteit 7%

Hier is een voorbeeld waarbij ik de functie Replace() nuttig vond om mij inzicht te geven. Het probleem vereiste dat een lange geheeltallige vector werd veranderd in een karaktervector en dat de gehele getallen werden vervangen door bepaalde karakterwaarden.

## figuring out replace( )
(test <- c(rep(1,3),rep(2,2),rep(3,1)))

die eruitziet als

[1] 1 1 1 2 2 3

en ik wil elke 1 vervangen door een A en 2 door een B en 3 door een C

letts <- c("A","B","C")

dus in mijn eigen geheime kleine “dirty-verse” heb ik een lus gebruikt

for(i in 1:3)
{test <- replace(test,test==i,letts[i])}

die deed wat ik wilde

test
[1] "A" "A" "A" "B" "B" "C"

In de eerste zin heb ik bewust weggelaten dat het echte doel was om van de grote vector van gehele getallen een factorvector te maken en de gehele getallen (niveaus) enkele namen (labels) toe te kennen.

Dus een andere manier om de toepassing Replace() hier uit te voeren zou zijn

(test <- factor(test,labels=letts))
[1] A A A B B C
Levels: A B C

Other episodes