Mam dataframe, który wygląda w ten sposób:

  Name    Variable1 Value1 Variable2 Value2
1 Michael         A      2      <NA>     <NA>
2 Michael         B      3      <NA>     <NA>
3 Michael      <NA>   <NA>         X       10
4    John         B      5      <NA>     <NA>
5    John         E      3      <NA>     <NA>
6    John      <NA>    <NA>        Y      20
7    John      <NA>    <NA>        Z      40
8    Paul         C     10      <NA>     <NA>
9    Paul         D      5      <NA>     <NA>

We wszystkich wierszach znajduje się para Zmienna1/Wartość1 lub Zmienna2/Wartość2. Próbuję użyć dplyr z kombinacją funkcji group_by i filter do wygenerowania ramki danych, która ma (1) tylko jeden wiersz dla każdej nazwy i (2) maksymalną wartość pary dla 1 i 2. W tym przypadku mój stół finałowy wyglądałby mniej więcej tak:

     Name Variable1 Value1 Variable2 Value2
1 Michael         B      3         X     10
2    John         B      5         Z     40
3    Paul         C     10      <NA>   <NA>

Wygląda na to, że nie mogę uzyskać prawidłowego przebiegu grupowania, aby wykonać to poprawnie. Jednym z rozwiązań, o którym pomyślałem, jest podzielenie ramki danych na dwie dla każdej pary, filtrowanie, używanie group_by i filter na każdym z osobna, a następnie łączenie ich z powrotem na podstawie nazwy, ale zastanawiałem się gdyby ktoś miał do zaoferowania prostsze rozwiązanie. Może coś z summarise?

Dziękuję Ci!

EDYCJA: Poprawiono brakujące wartości NA w tabeli.

2
TactfulCactus 13 listopad 2018, 04:43

1 odpowiedź

Najlepsza odpowiedź
library(dplyr)

df[is.na(df)] <- 0

df1 <-
  df %>%
  select(1:3)

df1_max <-
  df %>%
  group_by(Name) %>%
  summarise(Value1 = max(Value1))

df2 <-
  df %>%
  select(c(1, 4:5))

df2_max <-
  df %>%
  group_by(Name) %>%
  summarise(Value2 = max(Value2))

result <- left_join(
  left_join(df1_max, df1),
  left_join(df2_max, df2) %>%
    distinct()
) %>%
  select(c(1, 3, 2, 5, 4))

result[result == 0] <- NA

Wynik:

result

# A tibble: 3 x 5
  Name    Variable1 Value1 Variable2 Value2
  <chr>   <chr>      <dbl> <chr>      <dbl>
1 John    B              5 Z             40
2 Michael B              3 X             10
3 Paul    C             10 <NA>          NA

Uwagi:

  • W ramkach danych elementy w rzędzie nie są od siebie niezależne. Więc nie powinieneś być w stanie oddzielić ich od siebie. Ale to właśnie próbujesz zrobić, ponieważ maksymalna wartość Variable1 i maksymalna wartość Variable2 nie znajdują się w tym samym wierszu, ale chcesz, aby Twój wynik miał maksymalną wartość dla każdego z nich (w ten sposób tworząc wiersz, który nie istnieje w oryginalnej ramce danych). Dlatego podzieliłem ramkę danych na 2, a następnie ponownie skojarzyłem je za pomocą złączenia.

  • Maksimum NA i wartość to NA (nie wiemy, jaka jest wartość NA, ponieważ jej brakuje, więc nie możemy wiedzieć, jaka jest wartość maksymalna). Jednak uważasz, że NA jest gorszy od jakiejkolwiek wartości. Ponieważ tak nie działa R, musiałem przypisać 0 do Twojego NA, aby uzyskać maksimum w sposób, w jaki to uważasz, a następnie ponownie przypisać NA do 0 na końcu .

  • W Twoich danych brakuje dwóch wartości, które uznałem za NA.

1
prosoitos 13 listopad 2018, 05:57