Сбор, усреднение и результат - PullRequest
0 голосов
/ 11 января 2020

Приветствую вас всех хороших людей,

Я смотрю оценки по математике и естественным наукам для разных стран, которые публикует ОЭСР-PISA. Хотя я смотрю на разные оценки, которые достигли разные студенты, я обнаружил строку под названием «Выбранные страны и юрисдикции». После поиска имени я нашел ответ в книге «Раннее преимущество: создание систем, которые работают для маленьких детей». В этой строке представлены средние оценки по группе студентов из выбранных стран [1. Австралия, 2. Англия, 3. Финдленд, 4. Гонконг, 5. Республика Корея c, 6. Сингапур].

Допустим, у меня есть следующие межстрановые данные:

year  country          GDP_growth   R&D_exp  Education_spending
2000  Australia        3.4          1.9      4.8
2001  Australia        2.1          0.9      5.0
2002  Australia        3.0          0.9      6.2
2000  England          3.6          3.9      7.8
2001  England          3.5          4.6      7.8
2002  England          3.2          4.0      7.9
2000  Findland         1.9          0.2      8.0
2001  Findland         2.2          0.7      8.1
2002  Findland         2.7          1.0      8.2

Мой вопрос: как я могу собрать данные о росте ВВП, расходах на НИОКР, ... для этих выбранных стран, рассчитать в среднем, и добавить результат в новой строке для каждого года? Я хочу сделать упомянутый шаг для всех лет (с 2000 по 2018 год).

Итак, к концу у меня появятся новые строки с названием «Выбранные страны и юрисдикции» для разных лет, которые будут иметь окончательные результаты (агрегированные и усредненные) в следующем виде:

year     country                                GDP_growth  R&D_exp    Education_spending
2000     Selected countries and jurisdications   3.5         3.1        6.1
2001     Selected countries and jurisdications
...

Пожалуйста, поделитесь своими идеями и мыслями о том, как такое можно сделать.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 11 января 2020

Вы можете использовать aggregate(). Для выбора просто используйте вектор country.set. Предварительно целесообразно использовать синтаксически допустимые имена , которых можно достичь с помощью make.names().

names(dat) <- make.names(names(dat))

country.set <- c("Australia", "England")

cbind(aggregate(cbind(GDP_growth, R.D_exp, Education_spending) ~ year, 
          dat[dat$country %in% country.set, ], mean), 
      country="Selected countries and jurisdications")[c(1, 5, 2:4)]  # some ordering
#   year                               country GDP_growth R.D_exp Education_spending
# 1 2000 Selected countries and jurisdications        3.5    2.90               6.30
# 2 2001 Selected countries and jurisdications        2.8    2.75               6.40
# 3 2002 Selected countries and jurisdications        3.1    2.45               7.05

Данные:

dat <- structure(list(year = c(2000L, 2001L, 2002L, 2000L, 2001L, 2002L, 
2000L, 2001L, 2002L), country = c("Australia", "Australia", "Australia", 
"England", "England", "England", "Findland", "Findland", "Findland"
), GDP_growth = c(3.4, 2.1, 3, 3.6, 3.5, 3.2, 1.9, 2.2, 2.7), 
    `R&D_exp` = c(1.9, 0.9, 0.9, 3.9, 4.6, 4, 0.2, 0.7, 1), Education_spending = c(4.8, 
    5, 6.2, 7.8, 7.8, 7.9, 8, 8.1, 8.2)), row.names = c(NA, -9L
), class = "data.frame")
1 голос
/ 11 января 2020

Вот базовое решение R с использованием aggregate() + cbind()

select_crt <- c("England","Findland")
dfout <- cbind(aggregate(cbind(GDP_growth, R.D_exp, Education_spending)~year,subset(df,country %in% select_crt), FUN = mean),select_crt = toString(select_crt))

или

select_crt <- c("England","Findland")
dfsel <- subset(df,country %in% select_crt)
dfout <- cbind(aggregate(dfsel[-c(1:2)],dfsel[1], FUN = mean), select_crt = toString(select_crt))

, и оба из них дадут вам

> dfout
  year GDP_growth R.D_exp Education_spending        select_crt
1 2000       2.75    2.05               7.90 England, Findland
2 2001       2.85    2.65               7.95 England, Findland
3 2002       2.95    2.50               8.05 England, Findland

ДАННЫЕ

df <- structure(list(year = c(2000L, 2001L, 2002L, 2000L, 2001L, 2002L, 
2000L, 2001L, 2002L), country = c("Australia", "Australia", "Australia", 
"England", "England", "England", "Findland", "Findland", "Findland"
), GDP_growth = c(3.4, 2.1, 3, 3.6, 3.5, 3.2, 1.9, 2.2, 2.7), 
    R.D_exp = c(1.9, 0.9, 0.9, 3.9, 4.6, 4, 0.2, 0.7, 1), Education_spending = c(4.8, 
    5, 6.2, 7.8, 7.8, 7.9, 8, 8.1, 8.2)), class = "data.frame", row.names = c(NA, 
-9L))
0 голосов
/ 11 января 2020

Вот способ использования dplyr / tidyverse:

library(tidyverse)

df$country_n <- "Selected countries and jurisdications"
df <- df %>% 
      group_by(year, country_n) %>% 
      summarise_if(is.numeric, mean) %>% 
      rename(country = country_n)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...