用动态列总结 dplyr?

summarise dplyr with dynamic columns?

我有一些 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 

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