首页 > 解决方案 > 用动态列总结 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))

任何帮助表示赞赏。

标签: rdplyrsummarize

解决方案


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

我们可以看到两种方法都给出了相同的输出。


推荐阅读