Группа сравнения означает - PullRequest
       15

Группа сравнения означает

0 голосов
/ 10 февраля 2019

У меня есть набор данных, который выглядит следующим образом:

library(data.table)
df <- fread(
  "A   B   C   fac   H   I   J   iso   year   matchcode
     0   1   1   NA   0   1   0   NLD   2009   NLD2009
     1   0   2   NA   1   0   1   NLD   2009   NLD2009
     0   0   3   B    1   0   0   AUS   2011   AUS2011
     1   0   4   B    0   1   0   AUS   2011   AUS2011
     0   1   7   NA   0   0   0   NLD   2008   NLD2008
     1   0   1   A    0   1   0   NLD   2008   NLD2008
     0   0   3   B    1   0   0   AUS   2012   AUS2012
     1   0   4   B    0   1   0   AUS   2012   AUS2012",
  header = TRUE
)

Для каждой страны я хотел бы проверить, изменяется ли среднее значение C с течением времени.Итак, я сделал:

setDT(df)[, c("MeanValue_C", "Residual_C") := {m= mean(C, na.rm=TRUE);list(m, C-m)}, by=list(iso, year)]

По сути, это дает мне информацию, которую я хочу.Однако не в любом полезном формате.Я пытался сделать table(df$MeanValue_C, df$matchcode), но это создало большую неразбериху, потому что в фактическом наборе данных есть около 100 стран с двумя или более годами.

Какой самый простой способ сравнить групповые средние значения для каждой страны,без создания дополнительных данных?

В идеале что-то вроде:

df2 <- fread(
  "C   iso   year   matchcode
     1.5   NLD   2009   NLD2009
     3.5   AUS   2011   AUS2011
     4     NLD   2008   NLD2008
     3.5   AUS   2012   AUS2012",
  header = TRUE
)

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Явно не говорится, что решение должно быть data.table, но tidyverse решение для получения заявленного результата:

library(tidyverse)

df %>% 
  group_by(iso, year, matchcode) %>% 
  summarise(C = mean(C)) %>% 
  select(C, iso, year, matchcode) 

# A tibble: 4 x 4
# Groups:   iso, year [4]
      C iso    year matchcode
  <dbl> <chr> <int> <chr>    
1   3.5 AUS    2011 AUS2011  
2   3.5 AUS    2012 AUS2012  
3   4   NLD    2008 NLD2008  
4   1.5 NLD    2009 NLD2009 
0 голосов
/ 10 февраля 2019

Вот начало.Вы можете запустить summary на среднегодовых значениях для каждой страны, чтобы получить базовые моменты выборки для каждой страны.summary возвращает вектор из 5-значного числа + среднее;as.list преобразует это так, что каждый элемент будет столбцом.keyby сортирует группировку (т. Е. Запускает setkey после выполнения операции):

df[ , .(c_mean = mean(C, na.rm = TRUE)), keyby = .(iso, year, matchcode)
    ][ , as.list(summary(c_mean)), keyby = .(iso, matchcode)]
#    iso matchcode Min. 1st Qu. Median Mean 3rd Qu. Max.
# 1: AUS   AUS2011  3.5     3.5    3.5  3.5     3.5  3.5
# 2: AUS   AUS2012  3.5     3.5    3.5  3.5     3.5  3.5
# 3: NLD   NLD2008  4.0     4.0    4.0  4.0     4.0  4.0
# 4: NLD   NLD2009  1.5     1.5    1.5  1.5     1.5  1.5

К сожалению, тип вывода summary не гарантированно будет иметь длину 5, как здесь.В частности, для чисел это будет длина-6, если на входе есть какие-либо значения NA_real_.Поскольку вы уже выполнили na.rm = TRUE, это возможно только в том случае, если есть комбинация iso - matchcode без значений, отличных от NA (чтобы подтвердить это, запустите summary(mean(NA_real_, na.rm = TRUE))).Чтобы продолжить, вы можете, например, сбросить такие значения заранее:

df[ , keyby = .(iso, year, matchcode),
   if (!all(is.na(C)) .(c_mean = mean(C, na.rm = TRUE)), 
    ][ , as.list(summary(c_mean)), keyby = .(iso, matchcode)]

Или отбросить их промежуточно:

df[ , .(c_mean = mean(C, na.rm = TRUE)), keyby = .(iso, year, matchcode)
    ][!is.na(c_mean), as.list(summary(c_mean)), keyby = .(iso, matchcode)]

Или, если вы не хотите потерять эту информацию (чтонекоторые комбинации отсутствуют), вы можете сделать вывод более согласованным:

df[ , .(c_mean = mean(C, na.rm = TRUE)), keyby = .(iso, year, matchcode)
    ][ , {
      s = summary(c_mean)
      if (length(s) == 5L) s = c(s, `NA's` = 0L)
      as.list(s)
    }, keyby = .(iso, matchcode)]

(Вы можете проверить код summary.default, запустив print(summary.default), чтобы убедиться, что это должно работать)

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