Funktion funktioniert nicht, Schleife aber schon

Allgemeine Fragen zur Programmierung mit R.

Funktion funktioniert nicht, Schleife aber schon

Beitragvon lumifex » Di 14. Aug 2018, 16:02

Hallo,

ich habe gerade erst angefangen in R Schleifen und Funktionen zu coden. Ich habe versucht für verschiedene dataframes die Spalte V38 und V39 von NA zu "befreien", weil ich sie danach zusammenfügen möchte (eigentlich gehören die Spalten zusammen..). Die Schleife selber funktioniert, wenn ich einen bestimmten Datensatz einsetzte, sobald ich aber versuche es für die Funktion zu verallgemeinern, funktioniert es nicht mehr.. Woran kann das liegen?

Das ist die Schleife, die funktioniert:

for (i in 1:672) {
VP01_lsd$V38[i][is.na(VP01_lsd$V38[i])]=""
VP01_lsd$V39[i][is.na(VP01_lsd$V39[i])]=""
}

Das ist die Funktion, die ich versucht habe:
NA.weg <- function(Data){
for (i in 1:672) {
Data$V38[i][is.na(Data$V38[i])]==""
Data$V39[i][is.na(Data$V39[i])]==""
}
}
lumifex
 
Beiträge: 9
Registriert: Di 14. Aug 2018, 15:43
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Funktion funktioniert nicht, Schleife aber schon

Beitragvon jogo » Di 14. Aug 2018, 20:15

Hallo lumifex,

in R herrscht die Aufrufkonvention "call by value". Das bedeutet, dass eine Funktion alle Eingabewerte nur als Kopie erhält. Auf so einer Kopie kann die Funktion dann rumwirtschaften, wie sie will - nur es ändert nichts an dem originalen Objekt. Das Ergebnis einer Funktion wird nur über den Rückgabewert an die aufrufende Umgebung geliefert.
Die Rückgabe des Ergebnisses geschieht entweder per expliziten return(...) oder es ist der Wert des zuletzt ausgewerteten Ausdrucks.
Deine Funktion liefert quasi kein Ergebnis zurück.

In R solltest Du die Funktion so programmieren:
Code: Alles auswählen
NA.weg <- function(x) {
  x[is.na(x)] <- ""
  return(x)
}
VP01_lsd$V38 <- NA.weg(VP01_lsd$V38)
VP01_lsd$V39 <- NA.weg(VP01_lsd$V39)

Lesestoff: https://cran.r-project.org/doc/manuals/ ... evaluation

Eine Kurzform der Funktion:
Code: Alles auswählen
NA.weg <- function(x) { x[is.na(x)] <- ""; x }

Programmieren ohne neue Funktion:
Code: Alles auswählen
VP01_lsd$V38[is.na(VP01_lsd$V38)] <- ""
VP01_lsd$V39[is.na(VP01_lsd$V39)] <- ""

Ansonsten noch der Hinweis:
oft ist es besser, NAs nicht gegen andere Werte auszutauschen.

Gruß, Jörg
jogo
 
Beiträge: 157
Registriert: Mo 26. Feb 2018, 09:56
Danke gegeben: 3
Danke bekommen: 1 mal in 1 Post

Re: Funktion funktioniert nicht, Schleife aber schon

Beitragvon lumifex » Mi 15. Aug 2018, 09:29

Hallo Jörg,

danke für deine Hilfe! das ist ein guter Tipp für die Zukunft :-)
Ich muss die beiden Zeilen zusammenfassen und das ging nicht mit den NAs darin, deswegen wollte ich die rausschreiben.

LG Lumifex
lumifex
 
Beiträge: 9
Registriert: Di 14. Aug 2018, 15:43
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post


Zurück zu Programmierung allgemein

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron