用动态列总结dplyr?

时间:2019-09-22 13:48:23

标签: r dplyr summarize

我有一些R代码可以用来做我想做的事情。但是现在的问题是: 有什么机制可以避免对A1 A2 A3等进行编码?我想为以A开头的所有列编写A *。依赖于代码中定义的列表长度,可以有任意数量的“ A”列。其余代码是动态的,但是在这里,我需要人工干预(在summerise语句中添加一些A列或删除一些A列)。

我已经找到了summary_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))

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

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

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