Код в R для суммирования только части столбца (группа определяется строками) - PullRequest
1 голос
/ 30 марта 2020

У меня есть таблица вида:

headers   c1.r1.s1  c1.r1.s2  c1.r2.s1  c1.r2.s2  c2.r1.s1
c1.r1.s1     34       76         86        21        45
c1.r1.s2     85       34         47        35        97
c1.r2.s1     12       25         64        47        23
c1.r2.s1     87       54         78        31        25
c2.r1.s1     34       67         49        10        72

, где заголовки столбцов (и строк) представляют комбинацию страны (1 и 2), региона (1 и 2) и сектора (1 и 2). Давайте для удобства назовем первый столбец «заголовками».

Я хотел бы добавить две дополнительные строки и столбцы с частичными суммами, определенными заголовками.

Для первой дополнительной строки и столбца: Я хотел бы добавить значения, определенные одним и тем же регионом в той же стране (в пределах определенного столбца и строки):

headers   c1.r1.s1  c1.r1.s2  c1.r2.s1  c1.r2.s2  c2.r1.s1   sum1r
c1.r1.s1   **34**   **76**       86        21        45     **110**
c1.r1.s2   **85**   **44**       47        35        97     **129**
c1.r2.s1     12       25       **64**    **47**      23     **111**
c1.r2.s1     87       54       **78**    **31**      25     **109**
c2.r1.s1     34       67         49        10      **72**   **72**
sum1c     **119**  **120**    **142**    **78**    **72**   

Для второго дополнительного столбца и строки я хочу что-то похожее, но добавление значений той же страны (как определено в заголовке):

headers   c1.r1.s1  c1.r1.s2  c1.r2.s1  c1.r2.s2  c2.r1.s1   sum1r     sum2r
c1.r1.s1   **34**   **76**     **86**    **21**      45       110     **217**
c1.r1.s2   **85**   **44**     **47**    **35**      97       129     **211**
c1.r2.s1   **12**   **25**     **64**    **47**      23       111     **148**
c1.r2.s1   **87**   **54**     **78**    **31**      25       109     **250**
c2.r1.s1     34       67         49        10      **72**     72      **72**
sum1c       119      120        142        78        72   
sum2c     **218**  **199**    **275**   **144**    **72**

Моя главная проблема заключается в том, что у меня много стран, регионов и секторов; и я не могу придумать, как кодировать «суммировать значения этого столбца, если заголовок строки такой же до такой степени».

Мне очень жаль, если это уже было на имя. Я оглянулся и не смог найти решение, но если кто-то может дать мне подсказку, я был бы невероятно благодарен.

РЕДАКТИРОВАТЬ

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

R частичная сумма строк / столбцов матрицы

Я не настолько знаком с R (очевидно), поэтому мне интересно, можно ли это изменить, чтобы соответствовать моей проблеме.

Я понимаю, что структура данных не идеальна , но мне нужно сохранить его как есть, поскольку он отражает межотраслевые потоки.

1 Ответ

0 голосов
/ 30 марта 2020

Вообще говоря, ваш фрейм данных инфляционный, поскольку имена столбцов и строк содержат одинаковую информацию, которая вам не поможет. постарайтесь сделать его более аккуратным, чтобы каждый кулмн содержал информацию одного типа, например, страну или регион. (Не имеет значения, если у двух разных стран одинаковый код региона, например, «r1», потому что с этим легко справится R.

Чтобы продемонстрировать, что я имею в виду, я создал этот короткий пример с континентами и их странами:

df<-cbind(na.exclude(countrycode::codelist[,c(2,18)]),
          rnorm(length(na.exclude(countrycode::codelist[,c(2,18)]))),
          dnorm(length(na.exclude(countrycode::codelist[,c(2,18)]))))
colnames(df)<-c("continent","region", "value", "value2")


#
> head(df)
  continent         region     value     value2
1      Asia    Afghanistan 0.4148095 0.05399097
2    Europe  Åland Islands 0.3974413 0.05399097
3    Europe        Albania 0.4148095 0.05399097
4    Africa        Algeria 0.3974413 0.05399097
5   Oceania American Samoa 0.4148095 0.05399097
6    Europe        Andorra 0.3974413 0.0539909

После этого мы используем пакет dplyr с функцией group для выполнения ваших вычислений:

library(dplyr)

df2<-df %>% 
group_by(continent) %>% mutate(continent.val.sums= sum(value, value2))

> head(df2)
# A tibble: 6 x 5
# Groups:   continent [4]
  continent region         value value2 continent.val.sums
  <chr>     <chr>          <dbl>  <dbl>              <dbl>
1 Asia      Afghanistan    0.415 0.0540               23.1
2 Europe    Åland Islands  0.397 0.0540               23.4
3 Europe    Albania        0.415 0.0540               23.4
4 Africa    Algeria        0.397 0.0540               26.7
5 Oceania   American Samoa 0.415 0.0540               11.9
6 Europe    Andorra        0.397 0.0540               23.4

Есть много способов и функций для выполнения этих типов вычислений, группируя и изменяя только один.

df3<-df2 %>%  group_by(region) %>% mutate(region.val.sums= sum(value2))


> head(df3)
# A tibble: 6 x 6
# Groups:   region [6]
  continent region         value value2 continent.val.sums region.val.sums
  <chr>     <chr>          <dbl>  <dbl>              <dbl>           <dbl>
1 Asia      Afghanistan    0.415 0.0540               23.1          0.0540
2 Europe    Åland Islands  0.397 0.0540               23.4          0.0540
3 Europe    Albania        0.415 0.0540               23.4          0.0540
4 Africa    Algeria        0.397 0.0540               26.7          0.0540
5 Oceania   American Samoa 0.415 0.0540               11.9          0.0540
6 Europe    Andorra        0.397 0.0540               23.4          0.0540

эта сумма, конечно, не имеет смысла, потому что сумма значения2 на регион равна значению, поскольку существует только одна отдельная область. Но только для демонстрации принципа можно создать другие группы и подгруппы или использовать другие функции, такие как среднее значение () или резюмировать () резюмировать () и т. д. c

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