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

У меня есть два набора данных, которые необходимо объединить, и один из них необходимо изменить в R.

Набор данных выглядит следующим образом:

    age_min    age_max    female   male   ID  value      date
      18         24         0       1     10   324    2018-02-05
      18         24         1       0     10   241    2018-02-05
      18         24         1       1     10   152    2018-02-05
      25         34         0       1     10   672    2018-02-05
      25         34         1       0     10   580    2018-02-05
      25         34         1       1     10   439    2018-02-05
      35         44         0       1     10   523    2018-02-05
      35         44         1       0     10   574    2018-02-05
      35         44         1       1     10   678    2018-02-05
      45         54         0       1     10   127    2018-02-05
      45         54         1       0     10   756    2018-02-05
      45         54         1       1     10   273    2018-02-05
      55         64         0       1     10   xxx    2018-02-05
      55         64         1       0     10   xxx    2018-02-05
      55         64         1       1     10   xxx    2018-02-05
      65+        NA         0       1     10   xxx    2018-02-05
      65+        NA         1       0     10   xxx    2018-02-05
      65+        NA         1       1     10   xxx    2018-02-05
      18         24         0       1     10   123    2018-02-06
      18         24         1       0     10   641    2018-02-06
      18         24         1       1     10   901    2018-02-06
      25         34         0       1     10   671    2018-02-06
      25         34         1       0     10   421    2018-02-06
      25         34         1       1     10   784    2018-02-06
      35         44         0       1     10   856    2018-02-06
      35         44         1       0     10   976    2018-02-06
      35         44         1       1     10  1243    2018-02-06
      45         54         0       1     10   745    2018-02-06
      45         54         1       0     10   929    2018-02-06
      45         54         1       1     10   781    2018-02-06
      55         64         0       1     10   xxx    2018-02-06
      55         64         1       0     10   xxx    2018-02-06
      55         64         1       1     10   xxx    2018-02-06
      65+        NA         0       1     10   xxx    2018-02-06
      65+        NA         1       0     10   xxx    2018-02-06
      65+        NA         1       1     10   xxx    2018-02-06

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

    age_min    age_max    female   male   ID  value      date
      18         24         0       1     10   324    2018-02-05
      18         24         1       0     10   241    2018-02-05
      18         24         1       1     10   152    2018-02-05
      25         34         0       1     10   672    2018-02-05
      25         34         1       0     10   580    2018-02-05
      25         34         1       1     10   439    2018-02-05
      35         44         0       1     10   523    2018-02-05
      35         44         1       0     10   574    2018-02-05
      35         44         1       1     10   678    2018-02-05
      45         54         0       1     10   127    2018-02-05
      45         54         1       0     10   756    2018-02-05
      45         54         1       1     10   273    2018-02-05
      55         64         0       1     10   xxx    2018-02-05
      55         64         1       0     10   xxx    2018-02-05
      55         64         1       1     10   xxx    2018-02-05
---------------------------------------------------------------------------
add   18         34         0       1     10   996    2018-02-05
      18         34         1       0     10   821    2018-02-05
      18         34         1       1     10   591    2018-02-05 
      18         44         0       1     10  1519    2018-02-05
      18         44         1       0     10  1395    2018-02-05
      18         44         1       1     10  1269    2018-02-05
      18         54         0       1     10  xxxx    2018-02-05
      18         54         1       0     10  xxxx    2018-02-05
      18         54         1       1     10  xxxx    2018-02-05
      18         65+        0       1     10  xxxx    2018-02-05
      18         65+        1       0     10  xxxx    2018-02-05
      18         65+        1       1     10  xxxx    2018-02-05
---------------------------------------------------------------------------
      18         24         0       1     10   123    2018-02-06
      18         24         1       0     10   641    2018-02-06
      18         24         1       1     10   901    2018-02-06
      25         34         0       1     10   671    2018-02-06
      25         34         1       0     10   421    2018-02-06
      25         34         1       1     10   784    2018-02-06
      35         44         0       1     10   856    2018-02-06
      35         44         1       0     10   976    2018-02-06
      35         44         1       1     10  1243    2018-02-06
      45         54         0       1     10   745    2018-02-06
      45         54         1       0     10   929    2018-02-06
      45         54         1       1     10   781    2018-02-06
      55         64         0       1     10   xxx    2018-02-06
      55         64         1       0     10   xxx    2018-02-06
      55         64         1       1     10   xxx    2018-02-06
---------------------------------------------------------------------------
add   18         34         0       1     10   794    2018-02-06
      18         34         1       0     10  1062    2018-02-06
      18         34         1       1     10  1685    2018-02-06
      18         44         0       1     10  1650    2018-02-06
      18         44         1       0     10  2038    2018-02-06
      18         44         1       1     10  2928    2018-02-06
      18         54         0       1     10  xxxx    2018-02-06
      18         54         1       0     10  xxxx    2018-02-06
      18         54         1       1     10  xxxx    2018-02-06
      18         65+        0       1     10  xxxx    2018-02-06
      18         65+        1       0     10  xxxx    2018-02-06
      18         65+        1       1     10  xxxx    2018-02-06
---------------------------------------------------------------------------

Этот пример взят из одного идентификатора, и существуют другие идентификаторы.

Я хочу суммировать значения строк 18-24 и 25-34 для создания новой строки 18-34, суммируйте значения строк 18-24, 25-34, 35-44 для создания строки 18-44, повторите аналогичный шаг, чтобы получить 18-54, 18-65 +.

Я достиг того, что хочу, с помощью кода, предоставленного Джоном Спрингом.Проблема в том, что значение кода = сумма (значение) будет суммировать значения из всех возрастных групп.Чтобы решить эту проблему, я удалил возрастную группу, которую я не хочу суммировать и вычислил общее значение для 18-34, 18-44, 18-54, 18-65 +.Большое спасибо за помощь, Джон!

Ответы [ 2 ]

1 голос
/ 18 мая 2019
df_summary <- df %>%
  group_by(female, male, ID, date) %>%
  summarize(age_min = min(age_min),
            age_max = max(age_max),
            value   = sum(value))
df %>% 
  bind_rows(df_summary) %>%
  arrange(date)   # Edit to sort by date

Вот вывод, который, кажется, соответствует обновленному OP:

   age_min age_max female male ID value       date
1       18      24      0    1 10   324 2018-02-05
2       18      24      1    0 10   241 2018-02-05
3       18      24      1    1 10   152 2018-02-05
4       25      34      0    1 10   672 2018-02-05
5       25      34      1    0 10   580 2018-02-05
6       25      34      1    1 10   439 2018-02-05
7       18      34      0    1 10   996 2018-02-05
8       18      34      1    0 10   821 2018-02-05
9       18      34      1    1 10   591 2018-02-05
10      18      24      0    1 10   123 2018-02-06
11      18      24      1    0 10   641 2018-02-06
12      18      24      1    1 10   901 2018-02-06
13      25      34      0    1 10   671 2018-02-06
14      25      34      1    0 10   421 2018-02-06
15      25      34      1    1 10   784 2018-02-06
16      18      34      0    1 10   794 2018-02-06
17      18      34      1    0 10  1062 2018-02-06
18      18      34      1    1 10  1685 2018-02-06
0 голосов
/ 18 мая 2019

Агрегируйте, затем свяжите ряды с нижней частью. Вот попытка в data.table :

library(data.table)
setDT(dat)
rbind(
  dat,
  dat[,
    .(age_min=min(age_min), age_max=max(age_max), value=sum(value)),
    by=.(female,male,ID,date)]
)
#   age_min age_max female male ID value       date
#1:      18      24      0    1 10   324 2018-02-05
#2:      18      24      1    0 10   241 2018-02-05
#3:      18      24      1    1 10   152 2018-02-05
#4:      25      34      0    1 10   672 2018-02-05
#5:      25      34      1    0 10   580 2018-02-05
#6:      25      34      1    1 10   439 2018-02-05
#7:      18      34      0    1 10   996 2018-02-05
#8:      18      34      1    0 10   821 2018-02-05
#9:      18      34      1    1 10   591 2018-02-05
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...