2016-09-07 10 views
3

I mit Beschreibung Statistiken eine Tabelle (Mittel für a, b und c) pro TypenR: finde die nächste Beobachtung Durchschnitte

### stats 
type <- c("a","b","c","d","e","f","g","h","i","j","k","l") 
mean_a <- c(0,1,1,0,2,2,0,4,4,0,5,5) 
mean_b<- c(4,7,8,0,3,10,5,4,7,0,1,6) 
mean_c<- c(1,2,0,3,4,5,1,24,3,0,4,5) 
stats <- data.frame(type, mean_a, mean_b, mean_c) 

I einen Datensatz mit Beobachtungen der Probe für die Parameter a, b und C. Jede der Proben haben einen bestimmten Typ

# data 
Id <- c("ted","bert","test","john","elf","fea","goul","houl","ili","jok","ko","lol") 
type <- c("a","a","b","d","f","f","c","d","a","b","k","l") 
a <- c(2,1,3,2,1,2,0,1,2,1,5,5) 
b<- c(1,3,4,7,5,4,5,6,5,0,1,6) 
c<- c(3,5,2,6,8,5,1,5,3,1,6,6) 
data <- data.frame(Id, type, a, b, c) 

diesen beiden Tabellen Folgen, würde Ich mag von data die Probe die meisten Vertreter der Art in stats nach den Statistiken erhalten. Von den meisten repräsentativen möchte ich die mit den nächsten Werten für a, b und c zu ihren jeweiligen Durchschnittswerten erhalten.

Ich kann keine Ideen im Internet nach 3 Durchschnitte (a, b und c) finden. Hilfe ist willkommen! Ouput wollte (aber nicht sicher, ob ted, Test und John in der Nähe von den Mittelwerten für die Typen sind a, b und c):

# output wanted 
Id <- c("ted","test","john") 
type <- c("a","b","c") 
a <- c(2,3,2) 
b<- c(1,4,7) 
c<- c(3,2,6) 
data2 <- data.frame(Id, type, a, b, c) 
+0

So würde was das erwartete Ergebnis in diesem Fall? (bearbeite die erwartete Ausgabe in deiner Frage) – Sotos

Antwort

4

die „repräsentativsten“, wie Sie auf eigene erwähnen ist sehr vage, aber hier ist ein Versuch, der die Differenz zwischen den Werten von data und den mean_values ​​von stats und hält fest, der mit dem niedrigsten Durchschnitt. Da ich zuvor die Datenrahmen verbunden habe, können Sie die select() Funktion am Ende des Codes verwenden und ändern (Variablen beibehalten/löschen) entsprechend.

library(dplyr) 
df1 <- merge(data1, stats, by = 'type') 
df1 %>% 
    mutate(new = abs(rowMeans(mapply(`-`, df1[,(3:5)], df1[,(6:8)])))) %>% 
    group_by(type) %>% 
    filter(new == min(new)) %>% 
    select(-new) 

#Source: local data frame [7 x 8] 
#Groups: type [7] 

# type  Id  a  b  c mean_a mean_b mean_c 
# <fctr> <fctr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 
#1  a ted  2  1  3  0  4  1 
#2  b test  3  4  2  1  7  2 
#3  c goul  0  5  1  1  8  0 
#4  d houl  1  6  5  0  0  3 
#5  f elf  1  5  8  2  10  5 
#6  k  ko  5  1  6  5  1  4 
#7  l lol  5  6  6  5  6  5 
+0

Kannst du etwas mehr erklären was ist 'mapply (' -', df1 [, (3: 5)], df1 [, (6: 8)]))) '? Soll die gewünschte Spalte in der Ausgabe ausgewählt werden? – Floni

+1

Verstanden, es funktioniert perfekt mit der Bearbeitung von 'df1 [, (3: 5)], df1 [, (6: 8)])))' zu den guten Spalten Zahlen – Floni

+1

@Floni die 'Mapply' bildet die Spalten von Interesse ab eins zu eins also 'df1 [, 3]' mit 'df1 [, 6]' und so weiter – Sotos

0

ich eine quadratische Maß für den Abstand gewählt haben, können Sie anpassen möchten dass, was auch immer Abstandsmaß Sie bevorzugen:

data$dist <- (data$a - stats[data$type, "mean_a"])^2 + 
      (data$b - stats[data$type, "mean_b"])^2 + 
      (data$c - stats[data$type, "mean_c"])^2 
closest <- which.min(data$dist) 
print(paste0("Closest is number ",closest, ": ",data[closest, "Id"])) 
+1

Ein quadratisches Maß kann gut sein, aber du ignorierst die Gruppierungsinformation ('type') in deiner Antwort –

+0

@docendo discimus Als ich meinen Code erfand. Das ursprüngliche Plakat hatte noch nicht auf Sotos Anfrage nach der erwarteten Ausgabe geantwortet. Mein Ansatz kann erweitert werden, um nicht für jede Gruppe ein Ergebnis, sondern ein Ergebnis zu erhalten. Als ich jedoch die erwartete Ausgabe sah, gab es bereits eine akzeptierte Antwort. – Bernhard

1
require(dplyr) 

inner_join(stats, data) %>% 
    rowwise %>% 
    mutate(diff = sum((a - mean_a)^2, 
        (b - mean_b)^2, 
        (c - mean_c)^2)) %>% 
    group_by(type) %>% 
    filter(diff == min(diff)) %>% 
    select(Id, type, a, b, c) 



#  Id type  a  b  c 
# <fctr> <chr> <dbl> <dbl> <dbl> 
# 1 ili  a  2  5  3 
# 2 test  b  3  4  2 
# 3 goul  c  0  5  1 
# 4 houl  d  1  6  5 
# 5 elf  f  1  5  8 
# 6  ko  k  5  1  6 
# 7 lol  l  5  6  6 
Verwandte Themen