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
,如果您希望保留任何其他组,则有意义
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获得您的预期输出。