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.
1 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ść toNA
(nie wiemy, jaka jest wartośćNA
, ponieważ jej brakuje, więc nie możemy wiedzieć, jaka jest wartość maksymalna). Jednak uważasz, żeNA
jest gorszy od jakiejkolwiek wartości. Ponieważ tak nie działa R, musiałem przypisać0
do TwojegoNA
, aby uzyskać maksimum w sposób, w jaki to uważasz, a następnie ponownie przypisaćNA
do0
na końcu .W Twoich danych brakuje dwóch wartości, które uznałem za
NA
.
Podobne pytania
Nowe pytania
r
R to darmowy język programowania typu open source i środowisko oprogramowania do obliczeń statystycznych, bioinformatyki, wizualizacji i obliczeń ogólnych. Proszę podać minimalne i powtarzalne przykłady wraz z pożądanymi wynikami. Użyj dput () dla danych i określ wszystkie pakiety inne niż podstawowe za pomocą wywołań biblioteki (). Nie osadzaj obrazów dla danych lub kodu, zamiast tego użyj wciętych bloków kodu. W przypadku pytań związanych ze statystykami należy skorzystać z https://stats.stackexchange.com.