如何通过选定的行值创建新行

时间:2019-05-18 04:17:28

标签: r dataframe

我需要连接两个数据集,其中一个需要在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

有许多不同的ID和日期,我想要得到的输出看起来像这样:

    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
---------------------------------------------------------------------------

此示例来自一个ID,并且存在其他ID。

我想将18-24和25-34行的值相加以创建新的18-34行,将18-24、25-34、35-44行的值相加以创建18-44行,重复类似的步骤即可获得18-54、18-65 +。

我已经通过Jon Spring提供的代码实现了我想要的。问题是代码value = sum(value)将汇总所有年龄段的值。为了解决该问题,我删除了不想汇总的年龄段并计算18-34、18-44、18-54、18-65 +的总价值。乔恩,非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

然后将行绑定到底部。这是 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