【问题标题】:summarise dplyr with dynamic columns? [duplicate]用动态列总结 dplyr? [复制]
【发布时间】:2020-01-22 18:42:21
【问题描述】:

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

感谢任何帮助。

【问题讨论】:

标签: r dplyr summarize


【解决方案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 

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

【讨论】:

  • 非常感谢!这解决了我的问题。顺便提一句。在我的示例中,“公会”包含 TRUE 或 FALSE 值在变异后我得到 1 或 0。我不得不重新编码它们,但它有效。
猜你喜欢
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
  • 2018-11-05
  • 2018-03-03
  • 2015-09-19
  • 2018-10-12
相关资源
最近更新 更多