【问题标题】:Group By Multiple Columns in R按 R 中的多列分组
【发布时间】:2019-07-19 20:08:52
【问题描述】:

我有一个数据集,我正在查看... 3 列包含 namestoreamount .... 看起来像这样

name        store     amount
John Doe    Target    150

现在的诀窍是这个John Doe 可能会再次出现在文件中,但有这个数据

name        store     amount
John Doe    Walmart   50

我想总结并添加 John Doe 的所有活动的新列,如下所示:

name        store A   amount A   store B   amount B
John Doe    Target    150        Walmart   50  
  • 我尝试了transposeddlyr,但没有任何运气。
  • 我已尝试转置和分组,但您似乎无法按多列分组

感谢您的帮助...

【问题讨论】:

  • 嗨,欢迎来到 SO!请查看how to askhow to make a good reproducible example。特别是,获得快速答案的最简单方法是提供示例数据(可以复制粘贴)、所需输出的示例以及您已经尝试过但没有提供所需输出的代码。绝对可以按多列进行分组,但在不确切知道您尝试了什么的情况下,我们无法清楚地看到误解。
  • Base R 的by 接受列列表作为其第二个参数,因此by(x, x[,c("name","store"), function(z) { ... }) 之类的内容将分别为您提供每个商店中的每个人(您需要在此处填写... )。如果您喜欢tidyverse 包,那么group_by(x, name, store) 也可以很好地工作。而data.table 提供xDT[, ..., by=c("name", "store")]

标签: r dplyr plyr data-manipulation


【解决方案1】:

我有一个适用于您给出的特定示例的解决方案,但我觉得它不是特别优雅,如果每个名称出现超过 2 次,它就不起作用(在这种情况下,您会必须为mutate 动词提供更多选项。

df <- tibble(name = c("John Doe"),
             store = c("Target", "Walmart"),
             amount = c(150, 50))

coalesce_by_column <- function(df) {
    return(dplyr::coalesce(!!! as.list(df)))
}

df2 <- df %>% 
    group_by(name) %>% 
    mutate(store_k = c("store A", "store B"),
           amount_k = c("amount A", "amount B")) %>% 
    spread(store_k, store) %>%
    spread(amount_k, amount) %>%
    summarise_all(coalesce_by_column)

coalesce_by_column 函数组合了包含 NA 的不相交的行(查看here 了解更多详细信息)。如果您想重新排列列顺序,可以使用select 轻松完成。

【讨论】:

  • 谢谢!我想我得到了 Mutate 函数的一些东西.... mutate 函数非常棒,我想我现在找到了解决方案!
  • 太棒了!也许您可以使用最终对您有用的解决方案来更新您的问题。
猜你喜欢
  • 2015-12-02
  • 2021-12-24
  • 2017-05-09
  • 2021-05-16
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
相关资源
最近更新 更多