Variablen verschachtelt indexieren (autom. Distanzberechnung für mehrere DS)
Verfasst: Di Jan 08, 2019 9:49 am
Hallo zusammen,
zu Trainingszwecken habe ich 5 Einträge der "Species-Spalte" des Iris DS gelöscht und möchte diese nun über die Ähnlichkeit der restlichen DS mit Hilfe des Minimums des Euklid'schen Abstands prognostizieren. Für eine Zeile klappt das noch (wenn auch etwas holprig):
Dies führt zu folgender Fehlermeldung:
Error in dist[n, i] <- sqrt((iris.gefuellt[i, 1] - iris.fehlend[n, 1])^2 + :
object of type 'closure' is not subsettable
Mein Ziel ist eigentlich, dass mir mein Code am Ende das Attribut "Species" für die 5 Zeilen, wo dieser Eintrag fehlt, automatisch ausspuckt, indem eine Schleife 5 mal (für jede Zeile, wo Attribut fehlt) den ähnlichsten DS ermittelt, daraus das "Species" übernimmt und diesen Wert dann in die Zelle reinschreibt, wo er fehlt. Das mit der mehrfachen Indexierung scheint aber zumindet so nicht zu funktionieren. Wie kann ich denn eine Variable so dynamisieren, dass ich den Code nicht für jede einzelne Fehlerzeile schreiben muss?
Vielen Dank schon mal
zu Trainingszwecken habe ich 5 Einträge der "Species-Spalte" des Iris DS gelöscht und möchte diese nun über die Ähnlichkeit der restlichen DS mit Hilfe des Minimums des Euklid'schen Abstands prognostizieren. Für eine Zeile klappt das noch (wenn auch etwas holprig):
Code: Alles auswählen
#Löschung von "Species" in der 1. Zeile von Iris:
zu.bestimmender.Fall <- iris[1,-5]
#Funktion dist() funktioniert nicht: nur die ersten 6 Zeilen werden bestimmt - warum?
#Daher Bestimmung der Distanz (Euklid) zw. Z1 und allen anderen DS
#Als Zielklasse des zu bestimmenden 1. DS wird die Ausprägung der ZK des DS mit
#der geringsten Distanz übernommen
#dist_1 <- 0
#i <- 2
for (i in 2:150){
dist_1[i] <- sqrt((iris[i,1]-iris[1,1])^2+(iris[i,2]-iris[1,2])^2+(iris[i,3]-iris[1,3])^2+(iris[i,4]-iris[1,4])^2)
}
Zielklasse.gesucht <- iris[which(dist_1[-1]==min(dist_1[-1]))+1,5]
#+1 ist Korrektur für die falsch zählende Schleife, -1 eliminiert den 1. DS (0), damit das echte Min gefunden wird
#Das war ein Bsp. für einen zu bestimmenden Datensatz - gibt es mehrere DS, bei
#denen das Attribut fehlt, muss diese Prozedur über eine weitere Schleife auf alle
#betroffenen DS ausgedehnt werden - wie? -> die auf Z1 zeigende 1 muss ebenfalls
#indexiert werden mit den Nummern aller Zeilen, bei denen ebenfalls Attribut leer
#Iris-Datensatz wurde modifiziert: 5 Einträge bei Species wurden gelöscht mit der
#Zielsetzung, diese alle automatisiert über eine verschachtelte Schleife über
#Dist_Euklid zu ermitteln
# 1. Ermittlung der betroffenen DS
iris.fehlend <- subset(iris.5fehlend, iris.5fehlend$species=='')
iris.gefuellt <- subset(iris.5fehlend, iris.5fehlend$species!='')
for (n in 1:nrow(iris.fehlend)) {
for (i in 1:nrow(iris.gefuellt)) {
dist[n, i] <- sqrt((iris.gefuellt[i,1]-iris.fehlend[n,1])^2+(iris.gefuellt[i,2]-iris.fehlend[n,2])^2+(iris.gefuellt[i,3]-iris.fehlend[n,3])^2+(iris.gefuellt[i,4]-iris.fehlend[n,4])^2)
}
}
Error in dist[n, i] <- sqrt((iris.gefuellt[i, 1] - iris.fehlend[n, 1])^2 + :
object of type 'closure' is not subsettable
Mein Ziel ist eigentlich, dass mir mein Code am Ende das Attribut "Species" für die 5 Zeilen, wo dieser Eintrag fehlt, automatisch ausspuckt, indem eine Schleife 5 mal (für jede Zeile, wo Attribut fehlt) den ähnlichsten DS ermittelt, daraus das "Species" übernimmt und diesen Wert dann in die Zelle reinschreibt, wo er fehlt. Das mit der mehrfachen Indexierung scheint aber zumindet so nicht zu funktionieren. Wie kann ich denn eine Variable so dynamisieren, dass ich den Code nicht für jede einzelne Fehlerzeile schreiben muss?
Vielen Dank schon mal