2016-07-11 5 views
2

nehme ich an Daten wie folgtdie minimale Differenz zwischen der Spalte drei und geben den entsprechenden Wert

data 

required_value   Value1   Value2  Value3 
    0.5     .1    0.3   0.4 
    1.0     1    0.7   0.2 
    1.5     .37    0.3   0.7 
    2.0     1.25   0.9   1.9 

I, welcher der drei Säulen (Wert1, Wert2, Wert3) am nächsten sind die finden wollen erforderlicher Wert und erstellen Sie eine neue Spalte und haben Sie hier den Wert des nächsten.

Meine Beispielausgabe ist,

data 

required_value   Value1   Value2  Value3  output 
    0.5     .1    0.3   0.4   0.4 
    1.0     1    0.7   0.2   1.0 
    1.5     .37    0.3   0.7   0.7 
    2.0     1.25   0.9   1.9   1.9 

Das folgende ist mein Versuch,

max.col(-abs(sweep(data[-1], 1, data$required_value)),"first") 

das gibt mir die Spalte, die am nächsten ist. Aber ich möchte den entsprechenden Wert finden.

Kann mir jemand dabei helfen?

Dank

Antwort

1

Ein on-Liner, die nicht sehr schön ist:

apply(data, 1, function(x) x[-1][which.min(abs(x[-1] - x[1]))]) 
# 0.4 1.0 0.7 1.9 
3

Aus der Spalte ID der Endlösung es fehlt nur ein Schritt ist. Sie können die Teilmenge nach einer Matrix verwenden, wie in Hadley Wickhams Advaned R: http://adv-r.had.co.nz/Subsetting.html beschrieben. Erstellen Sie eine Teilmengenmatrix, indem Sie Ihre bereits erkannten Spalten verwenden, und für die Zeilen können Sie einfach eine laufende Nummer verwenden.

df <- read.table(text = "required_value   Value1   Value2  Value3 
          0.5     0.1    0.3   0.4 
          1.0     1    0.7   0.2 
          1.5     0.37    0.3   0.7 
          2.0     1.25   0.9   1.9", header = TRUE) 

min_id  <- max.col(-abs(sweep(df[-1], 1, df$required_value)),"first") 
df$min_div <- df[cbind(1:4, min_id + 1)] 

    df 
# required_value Value1 Value2 Value3 min_div 
# 1   0.5 0.10 0.3 0.4  0.4 
# 2   1.0 1.00 0.7 0.2  1.0 
# 3   1.5 0.37 0.3 0.7  0.7 
# 4   2.0 1.25 0.9 1.9  1.9 
Verwandte Themen