2017-12-13 8 views
2

Ich arbeite gerade an einem Datensatz, der während eines Laborexperiments erzeugt wurde, wo Beobachtungen verdoppelt wurden (zwei Mal gemessen).Doppelte Zeilen bedeutet mit Originalvariablen

Ich habe ID des beobachteten Objekts, die value der Ergebnisse, die type des Objekts und die hour es gemessen wurde (+120 andere kategorische, Zeichen und numerischen Variablen, die ich meine, wollen). Hier ist ein vereinfachtes Datenrahmen:

library(dplyr) 
    A <- c(1,1,2,2,3,3,4) 
    B <- A*2.5+(rnorm(2,A[A],sd = 0.2)) 
    C <- c("banana","banana","poireau","poireau","melon","melon","kiwi") 
    D <- c("H1","H2","H3","H4","H5","H6","H7") 

    df <-data_frame(ID=as.integer(A),value=B,type=factor(C), hour=as.character(D)) 

    df 

# A tibble: 7 x 4 
    ID  value type hour 
    <int>  <dbl> <fctr> <chr> 
1  1 3.337352 banana H1 
2  1 3.398814 banana H2 
3  2 5.837352 poireau H3 
4  2 5.898814 poireau H4 
5  3 8.337352 melon H5 
6  3 8.398814 melon H6 
7  4 10.837352 kiwi H7 

Mein Ziel ist der Werte von ID, um zu berechnen de bedeuten nur einen Wert zu halten, eine ID, aber immer noch die anderen Variablen behalten. was ich versucht war:

df %>% group_by(ID) %>% summarise_if(is.double, mean) 
# A tibble: 4 x 2 
    ID  value 
    <int>  <dbl> 
1  1 3.368083 
2  2 5.868083 
3  3 8.368083 
4  4 10.837352 

wie Sie sehen können, dplyr auf mein Kommando reagieren: es nur doppelte Werte bedeutet, aber wie kann ich andere Spalten halten?

wie für die hour Feld, ich möchte den ersten Wert in der Tabelle zu halten. die gewünschte Ausgabe wäre:

 # A tibble: 4 x 4 
    ID `mean(value)` type hour 
    <int>   <dbl> <fctr> <chr> 
1  1  3.368083 banana H1 
2  2  5.868083 poireau H3 
3  3  8.368083 melon H5 
4  4  10.837352  kiwi H7 

Vielen Dank!

Antwort

2

Wir tun können, ein mutate_if und verwenden Sie dann distinct

library(dplyr) 
df %>% 
    group_by(ID) %>% 
    mutate_if(is.double, mean) %>% 
    distinct(ID, value, .keep_all = TRUE) 
# A tibble: 4 x 4 
# Groups: ID [4] 
#  ID  value type hour 
# <int>  <dbl> <fctr> <chr> 
#1  1 3.368083 banana H1 
#2  2 5.868083 poireau H3 
#3  3 8.368083 melon H5 
#4  4 10.837352 kiwi H7 
+1

Vielen Dank! Was ich für meine 130+ Variablen verwendet habe, war: 'df%>% group_by (ID)%>% mutate_if (is.double, mean)%>% distinct (ID, is.double, .keep_all = TRUE)' –

1

Ist es wichtig, dass Sie nur über double Variablen meinen? Hier ist ein Code, die für Ihr Beispiel funktioniert:

df %>% group_by(ID) %>% summarise(value = mean(value), type = first(type), hour = first(hour)) 

# A tibble: 4 x 4 
    ID  value type hour 
    <int>  <dbl> <fctr> <chr> 
1  1 3.312154 banana H1 
2  2 5.812154 poireau H3 
3  3 8.312154 melon H5 
4  4 10.690296 kiwi H7 
+0

Dank! Das ist ein Weg, es zu tun, aber ich habe 135 Variablen der 3 Art. Ich hoffte also, dass ich etwas bekommen könnte, das automatisch mit dem variablen Typ arbeitet. –

+0

Dann könnte @akrun Lösung gut funktionieren – Sush