Как вычесть значение каждой страны по годам - PullRequest
0 голосов
/ 05 июля 2019

У меня есть данные для счастья каждой страны (https://www.kaggle.com/unsdsn/world-happiness),), и я сделал данные для каждого года отчетов. Теперь я не знаю, как вычесть значения для каждого года друг от друга, например, как сделал Смена ранга счастья с 2015 на 2017/2016 по 2017 год? Я хотел бы сделать для каждого новое значение различий.

Мне удалось связать таблицы для общих столбцов, и я начал работу по удалению стран, которые не имеют данных за все 3 года. Я не уверен, пойду ли я по сложному пути.

keepcols <- c("Country","Happiness.Rank","Economy..GDP.per.Capita.","Family","Health..Life.Expectancy.","Freedom","Trust..Government.Corruption.","Generosity","Dystopia.Residual","Year")
mydata2015 = read.csv("C:\\Users\\mmcgown\\Downloads\\2015.csv")
mydata2015$Year <- "2015"
data2015 <- subset(mydata2015, select = keepcols )
mydata2016 = read.csv("C:\\Users\\mmcgown\\Downloads\\2016.csv")
mydata2016$Year <- "2016"
data2016 <- subset(mydata2016, select = keepcols ) 
mydata2017 = read.csv("C:\\Users\\mmcgown\\Downloads\\2017.csv")
mydata2017$Year <- "2017"
data2017 <- subset(mydata2017, select = keepcols ) 
df <- rbind(data2015,data2016,data2017)
head(df, n=10)
tail(df, n=10)

df15 <- df[df['Year']=='2015',]
df16 <- df[df['Year']=='2016',]
df17 <- df[df['Year']=='2017',]
nocon <- rbind(setdiff(unique(df16['Country']),unique(df17['Country'])),setdiff(unique(df15['Country']),unique(df16['Country'])))

У меня нет четкого пути для достижения того, чего я хочу, но это будет выглядеть

df16_to_17
Country   Happiness.Rank  ...(other columns)
Yemen     (Yemen[Happiness Rank in 2017] - Yemen[Happiness Rank in 2016])
USA       (USA[Happiness Rank in 2017] - USA[Happiness Rank in 2016])
(other countries)

df15_to_16
Country   Happiness.Rank  ...(other columns)
Yemen     (Yemen[Happiness Rank in 2016] - Yemen[Happiness Rank in 2015])
USA       (USA[Happiness Rank in 2016] - USA[Happiness Rank in 2015])
(other countries)

Ответы [ 2 ]

0 голосов
/ 05 июля 2019

Это очень просто с 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
0 голосов
/ 05 июля 2019

Предполагая, что в вашей среде присутствуют три набора данных с именами data2015, data2016 и data2017, мы можем добавить столбец year с соответствующим годом и оставить столбцы, присутствующие в keepcolsвектор.arrange данные по Country и Year, group_by Country, сохраняют только те страны, которые присутствуют за все 3 года, а затем вычитают значения из предыдущих строк, используя lag или diff.

library(dplyr)

data2015$Year <- 2015
data2016$Year <- 2016
data2017$Year <- 2017
df <- bind_rows(data2015, data2016, data2017)
data <- df[keepcols]

data %>%
  arrange(Country, Year) %>% 
  group_by(Country) %>%
  filter(n() == 3) %>%
  mutate_at(-1, ~. - lag(.)) #OR
  #mutate_at(-1, ~c(NA, diff(.)))

# A tibble: 438 x 10
# Groups:   Country [146]
#   Country Happiness.Rank Economy..GDP.pe… Family Health..Life.Ex… Freedom
#   <chr>            <int>            <dbl>  <dbl>            <dbl>   <dbl>
# 1 Afghan…             NA          NA      NA            NA        NA     
# 2 Afghan…              1           0.0624 -0.192        -0.130    -0.0698
# 3 Afghan…            -13           0.0192  0.471         0.00731  -0.0581
# 4 Albania             NA          NA      NA            NA        NA     
# 5 Albania             14           0.0766 -0.303        -0.0832   -0.0387
# 6 Albania              0           0.0409  0.302         0.00109   0.0628
# 7 Algeria             NA          NA      NA            NA        NA     
# 8 Algeria            -30           0.113  -0.245         0.00038  -0.0757
# 9 Algeria             15           0.0392  0.313        -0.000455  0.0233
#10 Angola              NA          NA      NA            NA        NA     
# … with 428 more rows, and 4 more variables: Trust..Government.Corruption. <dbl>,
#   Generosity <dbl>, Dystopia.Residual <dbl>, Year <dbl> 

Значение первой строки для каждого Year всегда будет NA, остальные значения будут вычтены из его предыдущих значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...