r - 总结后变异 - dplyr
问题描述
我有一个玩具数据框,如下所示
Date Type Units
2016-10-11 A 11
2016-10-12 B 14
2016-10-12 C 10
2016-10-13 A 6
2016-10-13 B 4
2016-10-13 D 9
2016-10-14 E 7
2016-10-14 A 12
2016-10-14 C 12
2016-10-15 A 13
2016-10-15 F 12
2016-10-15 C 3
2016-10-15 D 4
df <- structure(list(Date = c("2016-10-11", "2016-10-12", "2016-10-12",
"2016-10-13", "2016-10-13", "2016-10-13", "2016-10-14", "2016-10-14",
"2016-10-14", "2016-10-15", "2016-10-15", "2016-10-15", "2016-10-15"
), Type = c("A", "B", "C", "A", "B", "D", "E", "A", "C", "A",
"F", "C", "D"), Units = c(11L, 14L, 10L, 6L, 4L, 9L, 7L, 12L,
12L, 13L, 12L, 3L, 4L)), class = "data.frame", row.names = c(NA,
-13L))
我想:添加一列,指示每个 中的类型数,并对列分组Date
求和。输出数据集将类似于以下内容:Units
Date
Date Units n_types
<chr> <int> <dbl>
2016-10-11 11 1
2016-10-12 24 2
2016-10-13 19 3
2016-10-14 31 3
2016-10-15 32 4
但是,如果没有两个函数,我就无法做到这一点mutate
,如下面的代码所示:
df %>%
group_by(Date) %>%
mutate(n_types = n()) %>%
summarise_if(is.numeric, sum) %>%
mutate(n_types = sqrt(n_types)) %>%
ungroup()
注意:我使用summarise_if
的是因为在我的原始数据集中我有更多的数字变量而不仅仅是Units
,所以我必须使用这个函数。是否有另一种方法可以在n_types
不使用两个mutate
函数的情况下添加列?还是我的一个好方法?
解决方案
我们可以将n_types
也放在 中group_by
,然后执行summarise_if
以删除一个额外的步骤
df %>%
group_by(Date) %>%
group_by(n_types = n(), add = TRUE) %>%
summarise_if(is.numeric, sum)
# A tibble: 5 x 3
# Groups: Date [?]
# Date n_types Units
# <chr> <int> <int>
#1 2016-10-11 1 11
#2 2016-10-12 2 24
#3 2016-10-13 3 19
#4 2016-10-14 3 31
#5 2016-10-15 4 32
推荐阅读
- java - java.lang.NullPointerException:无法调用“服务”,因为“this.contentService”为空
- css - 如何在 TailwindCSS 和 Alpine.js 中构建没有重复标签内容的响应式手风琴标签?
- mysql - 最终 SQL 输出,使用 MySQL 更新到具有相同结构的基表
- node.js - 不存储刷新令牌的 Cookie
- swift - 如何制作搜索结果?UICollection 视图中的搜索栏
- mysql - 从 8.0.22 升级到 8.0.26 服务器重启失败
- mysql - 从 wordpress SQL 表中搜索和下载文件
- prolog - 如何在 Prolog 中获取列表的子列表?
- ruby-on-rails - RoR:编辑密码后设计 gem
- excel - 多个下拉列表的 xPath 命名映射