R 转化有效,但变异无效

R 转化有效,但变异无效,r,dplyr,mutate,R,Dplyr,Mutate,我有以下数据集以及此处未显示的其他列: v0102 v0103 child.below14 child.above14 1 31000010 1 0 0 2 31000010 1 0 0 3 31000010 1 1 0 4 31000010 1

我有以下数据集以及此处未显示的其他列:

  v0102      v0103      child.below14 child.above14
1 31000010   1                      0             0
2 31000010   1                      0             0
3 31000010   1                      1             0
4 31000010   1                      1             0
5 31605621   1                      0             0
6 31605621   1                      1             0
7 31605621   1                      1             0
8 31605877   1                      0             0
9 31605877   1                      1             0
我想按前两列分组,计算14岁以下和14岁以上儿童的数量。当我尝试transmute时,我得到了预期的答案:

df.pnad.mg %>% group_by(v0102, v0103) %>% transmute(children.below14 = sum(child.below14), children.above14 = sum(child.above14))

   v0102      v0103      children.below14 children.above14
 1 31000010   1                         3                0
 2 31000010   1                         3                0
 3 31000010   1                         3                0
 4 31000010   1                         3                0
 5 31605621   1                         2                0
 6 31605621   1                         2                0
 7 31605621   1                         2                0
 8 31605621   1                         2                0
 9 31605877   1                         1                0
但是,当我从transmute切换到mutate时,输出似乎忽略了group_by()动词:


我遗漏了什么吗?

您想要的功能是
汇总
而不是
变异

df.pnad.mg %>% 
  group_by(v0102, v0103) %>% 
  summarize(children.below14 = sum(child.below14), 
            children.above14 = sum(child.above14))
使用
mutate
时,它将计算总和,但保留所有行

使用您的九行数据,这是我得到的输出:

`summarise()` regrouping output by 'v0102' (override with `.groups` argument)
# A tibble: 3 x 4
# Groups:   v0102 [3]
     v0102 v0103 children.below14 children.above14
     <dbl> <dbl>            <dbl>            <dbl>
1 31000010     1                2                0
2 31605621     1                2                0
3 31605877     1                1                0

如果您想创建这些新列并删除旧列,那么
transmute
就是您要做的。

您想要的功能是
汇总
而不是
变异

df.pnad.mg %>% 
  group_by(v0102, v0103) %>% 
  summarize(children.below14 = sum(child.below14), 
            children.above14 = sum(child.above14))
使用
mutate
时,它将计算总和,但保留所有行

使用您的九行数据,这是我得到的输出:

`summarise()` regrouping output by 'v0102' (override with `.groups` argument)
# A tibble: 3 x 4
# Groups:   v0102 [3]
     v0102 v0103 children.below14 children.above14
     <dbl> <dbl>            <dbl>            <dbl>
1 31000010     1                2                0
2 31605621     1                2                0
3 31605877     1                1                0
如果要创建这些新列并删除旧列,则可以使用
transmute

通过以下方式解决此问题:

library("tidyverse")
dta <- read_delim(
    file = "id v0102      v0103      child.below14 child.above14
1 31000010   1                      0             0
2 31000010   1                      0             0
3 31000010   1                      1             0
4 31000010   1                      1             0
5 31605621   1                      0             0
6 31605621   1                      1             0
7 31605621   1                      1             0
8 31605877   1                      0             0
9 31605877   1                      1             0",
delim = " ",
col_types = cols(.default = col_integer()),
trim_ws = TRUE
)

group_by(dta, v0102, v0103, .add = TRUE) %>%
    mutate(across(
        .cols = starts_with("child"),
        .fns = sum,
        .names = "sum_{.col}"
    )) %>%
    ungroup()
库(“tidyverse”)
dta%
变异(
.cols=以“child”开头,
.fns=总和,
.names=“sum_{.col}”
)) %>%
解组()
结果
#一个tible:9 x 7
id v0102 v0103 child.below14 child.below14 sum_child.below14 sum_child.below14 sum_child.below14
1     1 31000010     1             0             0                 2                 0
2     2 31000010     1             0             0                 2                 0
3     3 31000010     1             1             0                 2                 0
4     4 31000010     1             1             0                 2                 0
5     5 31605621     1             0             0                 2                 0
6     6 31605621     1             1             0                 2                 0
7     7 31605621     1             1             0                 2                 0
8     8 31605877     1             0             0                 1                 0
9     9 31605877     1             1             0                 1                 0
笔记
  • .names
    参数采用规范,值得考虑,以便获得有意义的名称
  • .add
    groupby
    中添加
    ,如果您希望保留任何其他组,则有意义
这可以通过以下方式解决:

library("tidyverse")
dta <- read_delim(
    file = "id v0102      v0103      child.below14 child.above14
1 31000010   1                      0             0
2 31000010   1                      0             0
3 31000010   1                      1             0
4 31000010   1                      1             0
5 31605621   1                      0             0
6 31605621   1                      1             0
7 31605621   1                      1             0
8 31605877   1                      0             0
9 31605877   1                      1             0",
delim = " ",
col_types = cols(.default = col_integer()),
trim_ws = TRUE
)

group_by(dta, v0102, v0103, .add = TRUE) %>%
    mutate(across(
        .cols = starts_with("child"),
        .fns = sum,
        .names = "sum_{.col}"
    )) %>%
    ungroup()
库(“tidyverse”)
dta%
变异(
.cols=以“child”开头,
.fns=总和,
.names=“sum_{.col}”
)) %>%
解组()
结果
#一个tible:9 x 7
id v0102 v0103 child.below14 child.below14 sum_child.below14 sum_child.below14 sum_child.below14
1     1 31000010     1             0             0                 2                 0
2     2 31000010     1             0             0                 2                 0
3     3 31000010     1             1             0                 2                 0
4     4 31000010     1             1             0                 2                 0
5     5 31605621     1             0             0                 2                 0
6     6 31605621     1             1             0                 2                 0
7     7 31605621     1             1             0                 2                 0
8     8 31605877     1             0             0                 1                 0
9     9 31605877     1             1             0                 1                 0
笔记
  • .names
    参数采用规范,值得考虑,以便获得有意义的名称
  • .add
    groupby
    中添加
    ,如果您希望保留任何其他组,则有意义

我想创建一个新列,其中每对(v0102、v0103)的子级数大于或小于14。我不相信Summary能做到这一点。@Gustavarangel-这正是Summary能做到的。如果我不清楚的话,很抱歉。您的anwser为我提供了一个3行表,而不是我需要将它们与原始数据集放在一起的9行表。@Gustavarangel-我无法重现您在
mutate
中遇到的问题。如果
transmute
有效,为什么不直接使用它呢?我决定重新安装dplyr(与1.0.4版相同),现在我得到了预期的答案。很奇怪,但非常感谢你的努力!我想为每对(v0102,v0103)创建一个新列,其中包含14个以上和14个以下的子级。我不相信Summary能做到这一点。@Gustavarangel-这正是Summary能做到的。如果我不清楚的话,很抱歉。您的anwser为我提供了一个3行表,而不是我需要将它们与原始数据集放在一起的9行表。@Gustavarangel-我无法重现您在
mutate
中遇到的问题。如果
transmute
有效,为什么不直接使用它呢?我决定重新安装dplyr(与1.0.4版相同),现在我得到了预期的答案。很奇怪,但非常感谢你的努力!您是否可以运行packageVersion(“dplyr”)
?我使用1.0.2获得您的预期输出。您是否可以运行
packageVersion(“dplyr”)
?我使用1.0.2获得您的预期输出。