Ich bin neu in R und versuche, einige for-Schleifen durch Funktionen aus der anwendungsfamilie zu ersetzen. ich nicht noch völlig verstehen, wie sie funktionieren, aber ich schaffte es, ein Arbeits Stück Code zu erzeugen:gibt mehrere Werte von sapply/lapply zurück
#create some input data
tech<-data.frame(cbind(c("p1","p2","p3","p4"),c(15,15,15,100),c(10,8,18,100)))
colnames(tech)=c("id","capacity.el","capacity.th")
tech$capacity.el<-as.numeric(tech$capacity.el)
tech$capacity.th<-as.numeric(tech$capacity.th)
heat<-data.frame(cbind(c(2,12,6,20,32,21,25,16,34,0),c(31,18,3,27,30,31,18,4,24,7),c(2,12,6,20,32,21,25,16,34,0),c(31,18,3,27,30,31,18,4,24,7)))
colnames(heat)=c("p1","p2","p3","p4")
> tech
id capacity.el capacity.th
1 p1 2 1
2 p2 2 4
3 p3 2 3
4 p4 1 2
> heat
p1 p2 p3 p4
1 2 31 2 31
2 12 18 12 18
3 6 3 6 3
4 20 27 20 27
5 32 30 32 30
6 21 31 21 31
7 25 18 25 18
8 16 4 16 4
9 34 24 34 24
10 0 7 0 7
#the result should be a matrix/list
pel=matrix(,nrow=nrow(heat),ncol=ncol(heat))
epr=matrix(,nrow=nrow(heat),ncol=ncol(heat))
result<-list()
#main code
result<-sapply(colnames(heat),function(x) {
a<-tech$capacity.th[match(x,tech$id)]
b<-tech$capacity.el[match(x,tech$id)]
sapply(heat[,x],function(y) {
pel<-a*y
return(pel)
})
})
Die Idee ist, „Schleife“ durch die Spalten des „Wärme“ data.frame und einige führen Berechnungen mit Werte von der "Wärme" data.frame. Aus diesem Grund verwende ich die erste Sapply-Funktion, um die entsprechenden Eigenschaften für jede der Pflanzen in der Heat-Tabelle aus der Tech-Tabelle zu erhalten. Der zweite Sapply führt dann die Berechnungen durch. Die Ausgabe "Ergebnis" ist genau das, was ich wollte.
Jetzt möchte ich mehr als Wert aus jeder Zeile in "Wärme" (Pel und EPR) berechnen. Aber ich habe keine Ahnung, wie man diese Werte aus den Sapply-Funktionen extrahiert. Ich habe Folgendes mit einer Liste versucht, aber das extrahiert die Werte als eine große Matrix mit 20 Zeilen. Das perfekte Ergebnis wäre etwa eine Liste mit zwei Matrix- oder data.frame-Objekten, die jeweils 10 Zeilen und 4 Spalten mit den pel/epr-Werten haben.
result<-sapply(colnames(heat),function(x) {
a<-tech$capacity.th[match(x,tech$id)]
b<-tech$capacity.el[match(x,tech$id)]
sapply(heat[,x],function(y) {
pel<-a*y
epr<-b*y
})
new<-list(pel,epr)
return(new)
})
Ich würde mich über jede Hilfe oder Kommentar freuen.
vielen dank für ihren vorschlag. Ich verstehe, dass es in diesem Fall nicht notwendig ist, eine * apply-Funktion zu verwenden. aber die realen Daten sind 8760 Zeilen /> 300 Spalten und ich muss komplexere Berechnungen darauf durchführen als die Multiplikation im Beispiel – derdepe
@derdepe Wenn Ihre Daten in einer Datenbank organisiert sind, ist es noch interessanter, dplyr zu verwenden. Da die von diesem Paket bereitgestellten Operationen direkt auf den db-Tabellen ausgeführt werden. [siehe dplyr vignette] (https://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html). Auch dieses Paket enthält viele Übersichts- und Fensterfunktionen. – MarkusN