r - 单步结合 tidyr::spread 和 dplyr::summarise

标签 r dplyr tidyr

我经常希望“一步”执行 tidyr::spreaddplyr::summarise 以按组聚合数据。我想要的内容显示在预期中。我可以通过分别执行summarisespread并将结果与​​dplyr::full_join组合来获得预期,但我正在寻找避免 full_join 的替代方法。真正的单步方法是没有必要的。

df <- data.frame(
        id = rep(letters[1], 2),
        val1 = c(10, 20),
        val2 = c(100, 200),
        key = c("A", "B"),
        value = c(1, 2))

library(tidyverse)
result1 <- df %>%
              group_by(id) %>%
              summarise(
                val1 = min(val1),
                val2 = max(val2)
              )
# A tibble: 1 x 3
  # id      val1  val2
  # <fctr> <dbl> <dbl>
# 1 a       10.0   200

result2 <- df %>%
              select(id, key, value) %>%
              group_by(id) %>%
              spread(key, value)
# A tibble: 1 x 3
# Groups: id [1]
  # id         A     B
# * <fctr> <dbl> <dbl>
# 1 a       1.00  2.00

expected <- full_join(result1, result2, by="id")
# A tibble: 1 x 5
  # id      val1  val2     A     B
  # <fctr> <dbl> <dbl> <dbl> <dbl>
# 1 a       10.0   200  1.00  2.00

最佳答案

我怀疑您的数据可能有更多需要修改的边缘情况,但为什么不简单地传播然后汇总呢?您可以为每个变量单独指定汇总函数,因此对于 AB ,您实际上不需要计算任何内容(我假设),您可以删除所有NA:

df %>%
  spread("key", "value") %>%
  group_by(id) %>%
  summarise(
    val1 = min(val1),
    val2 = max(val2),
    A = mean(A, na.rm = TRUE),
    B = mean(B, na.rm = TRUE)
    )
# A tibble: 1 x 5
  id     val1  val2     A     B
  <fct> <dbl> <dbl> <dbl> <dbl>
1 a      10.0   200  1.00  2.00

关于r - 单步结合 tidyr::spread 和 dplyr::summarise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48835980/

相关文章:

r - 检查每个具有相同唯一 ID 的唯一值

r - 如何在R中对这些数据进行排序

xml - 如何在r中将向量输出到xml

r - 数据框列的 apply 和 sapply 之间的区别?

在 R 中系统地重命名字符串

r - 选择数据表中的连续列和非连续列,如 dplyr 的 group_by 中

r - 在一个函数中分布多个列

r - 在 R 中对函数进行算术运算的最佳方法是什么?

r - 如何计算特定年份中 R 中的小数月份?

r - 使用dplyr和stringr替换所有值始于