Это очень просто с dplyr, и включает в себя группирование по стране, а затем нахождение различий между последовательными значениями с базовыми R diff
. Просто убедитесь, что вы используете df
, а не df15
и т. Д.:
library(dplyr)
rank_diff_df <- df %>%
group_by(Country) %>%
mutate(Rank.Diff = c(NA, diff(Happiness.Rank)))
Выше предполагается, что данные упорядочены по годам, как и в вашем случае из-за того, как вы объединили кадры данных. Если нет, вам нужно позвонить arrange(Year)
до вызова mutate
. Отфильтровывать страны с отсутствующими данными за год необязательно, но это можно сделать после group_by()
с помощью filter(n() == 3)
.
Если вы хотите увидеть различия, имеет смысл отбросить некоторые переменные и изменить порядок данных:
rank_diff_df %>%
select(Year, Country, Happiness.Rank, Rank.Diff) %>%
arrange(Country)
Что возвращает:
# A tibble: 470 x 4
# Groups: Country [166]
Year Country Happiness.Rank Rank.Diff
<chr> <fct> <int> <int>
1 2015 Afghanistan 153 NA
2 2016 Afghanistan 154 1
3 2017 Afghanistan 141 -13
4 2015 Albania 95 NA
5 2016 Albania 109 14
6 2017 Albania 109 0
7 2015 Algeria 68 NA
8 2016 Algeria 38 -30
9 2017 Algeria 53 15
10 2015 Angola 137 NA
# … with 460 more rows
Приведенный выше фрейм данных будет хорошо работать с ggplot2, если вы планируете выводить результаты.
Если вы не чувствуете себя комфортно с dplyr, вы можете использовать базовые R merge
, чтобы объединить кадры данных, а затем создать новый кадр данных с различиями в виде столбцов:
df_wide <- merge(merge(df15, df16, by = "Country"), df17, by = "Country")
rank_diff_df <- data.frame(Country = df_wide$Country,
Y2015.2016 = df_wide$Happiness.Rank.y -
df_wide$Happiness.Rank.x,
Y2016.2017 = df_wide$Happiness.Rank -
df_wide$Happiness.Rank.y
)
Что возвращает:
head(rank_diff_df, 10)
Country Y2015.2016 Y2016.2017
1 Afghanistan 1 -13
2 Albania 14 0
3 Algeria -30 15
4 Angola 4 -1
5 Argentina -4 -2
6 Armenia -6 0
7 Australia -1 1
8 Austria -1 1
9 Azerbaijan 1 4
10 Bahrain -7 -1