2017-01-24 3 views
1

Ich möchte bestimmte Werte aus dem Vektor extrahieren und sie dann in meiner Funktion verwenden. Ich werde es am Beispiel erklären.R: Extrahieren Sie Werte aus dem Vektor und verwenden Sie sie in Funktion, um den Unterschied zu berechnen

Diese alle Berechnungen finden in glänzende App statt, dieses Beispiel ist eine vereinfachte Version.

Im Moment ...

I berechnen die Zeitdifferenz der jede Probe zwischen zwei Temperaturpunkte für die X-Achse (die Proben unter Verwendung von ID-Spalte kann differenziert) (im Beispiel unten x1 = 600 -> es ist ein reaktiver Wert in meiner glänzenden App und x2 = 800 -> es ist ein konstanter Wert).

####Sample data 
data <- structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L,2L, 2L), 
       Zeit = c(0L, 180L, 360L, 420L, 600L, 604L, 0L, 180L,360L, 480L, 600L, 
         605L), Temp = c(963L, 824L, 666L, 658L, 641L,549L, 957L, 823L, 661L, 
             660L, 642L, 562L)), .Names = c("id","Zeit", "Temp"), row.names = c(NA, 
                              12L), class = "data.frame") 
####Calculating the time for x=600 (in my app it is a reactive value) 
Zt <- vapply(unique(data$id), function(a){ 
    with(data[data$id == a,], approx(x = Temp, y = Zeit, xout = paste(600)))$y ###in my original data it is a reactive value:paste(input$t8xzeit) 
}, double(1)) 
datat5 <- data.frame(ID = unique(data$id), Zeit= Zt) 
####Calculating the time for x=800 
Zt2 <- vapply(unique(data$id), function(a){ 
    with(data[data$id == a,], approx(x = Temp, y = Zeit, xout = paste(800)))$y 
}, double(1)) 
datat8 <- data.frame(ID = unique(data$id), Zeit2= Zt2) 
####Merging the data 
datat85 <- merge(datat5,datat8,by="ID") 
####Calculating the difference 
datat85$delta <- (datat85$Zeit - datat85$Zeit2) 

Was ich tun muss ...

wenn wir x1 = 600 (die reaktive Wert ist) und x2 = 800, und wir wollen, dass alle Werte zwischen 600 und 800 zu 50 erhalten wir: 600.650.700.750.800. Dann muss ich jeden dieser Werte in meiner Funktion verwenden: Zt (siehe oben im Code) als xout =... und für jeden berechneten Wert eine neue Spalte erstellen.

Gibt es eine Möglichkeit, es irgendwie automatische zu machen (Schleife?)? Es ist nicht möglich, jedes Mal, wenn neue Zt Funktion zu schreiben, da die Anzahl der Werte im Vektor könnte aufgrund des reaktiven Wert x1 ändern.

Vielen Dank für Ihre Hilfe!

data.new <- data.frame(ID = unique(data$id)) 
vals <- seq(600,800,by=50) 
data.new[paste("Zeit",vals,sep="")] <- sapply(vals,function(xout.input) { 
    vapply(unique(data$id), function(a){ 
    with(data[data$id == a,], approx(x = Temp, y = Zeit, xout = xout.input))$y 
    }, double(1)) 
}) 

Dies funktioniert durch sapply mit Zt für alle gewünschten Werte anzuwenden enthalten die Schaffung einer Matrix, deren Spalten die Ergebnisse:

+1

'dat [seq (x1, x2, durch = 50)]'? Nicht sicher: * "Zeitdifferenz berechnen s/w die extrahierten Temp-Werte und ** immer Temp 800 **", das macht für mich keinen Sinn. – r2evans

+0

naja, es ist schwer zu erklären, aber ich versuche mein Bestes zu geben Ich erkläre zum Beispiel, wenn wir x1 = 600 und x2 = 800 haben, und wir wollen alle Werte zwischen 600 und 800 von 50, erhalten wir: 600,650,700,750,800 Dann muss ich jeden dieser Werte in meiner Funktion verwenden: ** Zt ** (siehe Code oben) als 'xout = ...' und erstelle eine neue Spalte mit berechnetem Wert –

Antwort

1

können Sie die Spalten für eine gegebene Liste von vals indem Sie die folgenden hinzuzufügen. Diese werden in dem neuen Rahmen gespeichert, indem die Matrix den Spalten mit den Namen paste("Zeit",vals,sep="") zugewiesen wird.

Dann

> data.new 
    ID Zeit600 Zeit650 Zeit700 Zeit750 Zeit800 
1 1 601.7826 504.7059 321.2658 264.3038 207.3418 
2 2 602.6250 546.6667 316.6667 261.1111 205.5556 
> datat85$Zeit == data.new$Zeit600 
[1] TRUE TRUE 
> datat85$Zeit2 == data.new$Zeit800 
[1] TRUE TRUE 

Ich hoffe, das hilft.

+0

Toll! Danke, dass es gut funktioniert! –

Verwandte Themen