2017-06-04 5 views
0

Ich habe eine Datenmenge (Mitarbeiter) erstellt von einem CSV, die Daten wie folgt angezeigt werden;Dataset und UDFs mit Sapply

employee[1,] 

age name designation 
28 Tony Manager 

Ich habe eine Funktion erstellt, die eine Entscheidung basierend auf einem Eingabeparameter zurückgibt;

loan_eligible_decision <- function(p) 
{ 
    if(p$designation == "manager") 
    { 
    decision <- "yes" 
    } 
    return(decision) 
} 

Wenn die Funktion direkt aufgerufen wird, funktioniert es gut und gibt das Ergebnis unten;

Wenn es jedoch innerhalb einer Sapply-Familie aufgerufen wird, löst es einen Referenzfehler aus;

sapply(data.frame(employee[1,]),loan_eligible_decision(x)) 

Error in p$marital : $ operator is invalid for atomic vectors 

Irgendwelche Vorschläge, was könnte eine mögliche Abhilfe/Lösung sein?

Ich habe auch versucht, die If-Bedingung mit zu ersetzen;

if(p[[designation]] == "manager") 

und die Funktion so aufgerufen;

sapply(employee['1',],loan_eligible_decision(x)) 

The error: 
Error in loan_eligible_decision(x) : object 'designation' not found 
+0

Das ist der falsche Weg, es anzuwenden. Für zeilenweise Operationen müssen Sie 'apply' mit' margin = 1' verwenden. Dies ist jedoch nicht der beste Weg, um mit R zu gehen. Ein vektorisierter Ansatz (der in diesem Fall "ifelse" verwendet) ist die beste Option. Auch hier brauchen Sie keine zeilenweise Operation. – Sotos

Antwort

0

Sie rufen die Funktion falsch auf. Es sollte auf jeden Fall

myfun <- function(x) x^2 

sapply(xy, FUN = myfun) 

sein, versuchen Sie einen browser() Anruf innerhalb der Funktion einsetzen und prüfen, was los ist. Weitere Informationen finden Sie unter ?browser.

myfun <- function(x) { 
    browser() 
    x^2 
} 
+0

Ich versuchte dies und noch ein Problem konfrontiert: 'x <-employee [1]' ' x [4]' _designation_ _1 manager_ 'gilt (x, 4, Funktion (x) { if (x $ Bezeichnung == "Manager") { Entscheidung <- "ja" } else { Entscheidung <- "no" } return (Entscheidung) }) ' Fehler: ' Fehler if (d2 == 0L) {: fehlender Wert, wo TRUE/FALSE benötigt wird – Avin

+0

@Avin Ich verstehe immer noch nicht, warum Sie nicht einfach 'ifelse (df $ bezeichnung == 'manager', 'ja', 'nein')' verwenden. Soweit dein "apply" geht ... sind viele Dinge falsch, beginnend mit der '4' als Rand, die' if' Anweisung mit der Verwendung von '<-', wo ist 'deision' definiert? etc. – Sotos

+0

Danke @sotos. Nur um zu verdeutlichen, dass ich versuche, die Möglichkeit einer Integration von Dataframe + UDF + sapply zu untersuchen und wie kompatibel sie sind, bin ich sicher, dass ifelse mir das Ergebnis geben wird, also habe ich die von Ihnen vorgeschlagenen Änderungen gemacht, aber ich möchte wissen, wie Sie sich bewerben arbeitet mit den gleichen Daten. Ich bin mit dem Fehler fest: 'Fehler in If (d2 == 0L) {: fehlender Wert wo TRUE/FALSE' Aktuelle Code:' apply (x, 4, Funktion (x) {ifelse (x $ Ehe == ' Manager ',' Ja ',' Nein '}}) ' – Avin