r - 用动态列总结 dplyr?
问题描述
我有一些 R 代码,我想要它做什么。但现在的问题是:有没有什么机制可以避免编码 A1 A2 A3 等等?我想为所有以 A 开头的列编码 A*。可以有任意数量的“A”列依赖于代码中定义的列表长度。其余代码是动态的,但在这里我有一个手动干预(在summerise 语句中添加一些A 列或删除一些A 列)。
我找到了summarize_at,但我不知道如何同时为其他列执行其他操作,例如last() 和sum()。
l_af <- l_cf %>%
group_by(PID, Server) %>%
summarise(Player=last(Player),
Guild=last(Guild),
Points=last(Points),
Battles=last(Battles),
A1=max(A1),
A2=max(A2),
A3=max(A3),
A4=max(A4),
A5=max(A5),
A6=max(A6),
RecCount=sum(RecCount))
任何帮助表示赞赏。
解决方案
使用summarise
它的问题是如果不使用它们,则会删除所有其他列。您可以考虑使用mutate
先执行所有操作,然后使用summarise
.
library(dplyr)
l_cf %>%
group_by(PID, Server) %>%
mutate_at(vars(Player,Guild,Points,Battles), last) %>%
mutate_at(vars(starts_with("A")), max) %>%
mutate(RecCount = sum(RecCount)) %>%
summarise_all(max)
一个可重现的例子
set.seed(123)
df <- data.frame(group = rep(1:5, 2), x = runif(10), y = runif(10),
a1 = runif(10), a2 = runif(10), z = runif(10))
首先为每列单独应用函数
df %>%
group_by(group) %>%
summarise(x=last(x),
y=last(y),
a1=max(a1),
a2=max(a2),
z=sum(z))
# A tibble: 5 x 6
# group x y a1 a2 z
# <int> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 1 0.0456 0.900 0.890 0.963 0.282
#2 2 0.528 0.246 0.693 0.902 0.648
#3 3 0.892 0.0421 0.641 0.691 0.880
#4 4 0.551 0.328 0.994 0.795 0.635
#5 5 0.457 0.955 0.656 0.232 1.01
现在将函数一起应用于多列
df %>%
group_by(group) %>%
mutate_at(vars(x, y), last) %>%
mutate_at(vars(starts_with("a")), max) %>%
mutate(z = sum(z)) %>%
summarise_all(max)
# group x y a1 a2 z
# <int> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 1 0.0456 0.900 0.890 0.963 0.282
#2 2 0.528 0.246 0.693 0.902 0.648
#3 3 0.892 0.0421 0.641 0.691 0.880
#4 4 0.551 0.328 0.994 0.795 0.635
#5 5 0.457 0.955 0.656 0.232 1.01
我们可以看到两种方法都给出了相同的输出。
推荐阅读
- amazon-web-services - AWS X-Ray:如何通过 Lambda --> SNS --> Lambda 传播 TraceId?
- ios - Ellysis 蓝牙嗅探 Apple Airpods
- html - 如何使用浏览器访问受限网站区域(权限设置为 700)?
- c++ - inline 和 __attribute__ inline 有什么区别?
- java - 如何按优先级迭代?
- android - new NotificationCompat.Builder(Context) - 如何从 url 设置大图标()
- angular - 带有可选查询参数的角路由器
- wordpress - 我正在尝试在我的 wordpress 网站上摘录一条长评论
- sql - “带查询”与“临时表”性能明智
- r - 使用 Winsorize 函数在 R 中按列对数据进行 Winsorize