【问题标题】:split-apply-combine: sorting and grouping multiple variables in Rsplit-apply-combine:在 R 中对多个变量进行排序和分组
【发布时间】:2017-12-19 23:53:22
【问题描述】:

我正在尝试根据两类数据之间的连续变量对数据框进行排序。具体来说,我想对连续变量进行排序(降序),但将相似类型的变量保留在一起。这是一个例子:

    pets <- data.frame(animal = c("dog", "dog", "dog", "cat", "cat", "fish", "fish", "fish"),
       breed = c("retriever", "husky", "husky", "grey", "white", "guppy", "betta", "betta"),
       count = c(4, 3, 7, 8, 9, 2, 12, 1))

现在,数据框未排序。我想对其进行排序,以使具有最高平均值 countbreeds 首先出现,但所有 breeds(和 animals)仍然组合在一起。如果我根据breed 对框架进行排序,则会丢失count 的正确顺序,反之亦然。即使我都这样尝试:

    pets[with(pets, order(breed, -count)), ]

输出未正确排序。我浏览了一些split-apply-combine tutorials,但我只能找到试图将一组数据放在一起的那些,而不是我的数据中的两组。

现在,这是我所拥有的最好的:

    split_pets <- split(pets, pets$animal)
    unlist(lapply(split_pets, function(x) sort(with(x, tapply(count, breed, mean)), decreasing = TRUE)))

返回

cat.white      cat.grey     dog.husky dog.retriever    fish.betta    fish.guppy 
      9.0           8.0           5.0           4.0           6.5           2.0

当然,我的输入顺序是正确的。但实际上我什至不在乎手段,我只需要根据此对 original 数据框进行排序。接下来是根据品种再次拆分它的兔子洞,但随后我将根据列表列表的数据框列进行排序。这听起来太复杂了。我也尝试过计数 ordering,然后将其从 dplyr 传递到 group_by(),但这并没有让我比现在更进一步。

感谢您的帮助!

【问题讨论】:

    标签: r sorting dplyr plyr


    【解决方案1】:

    您可以先对组进行排序,然后按照您的预期顺序将其加入到原始组中。

    pets <- data.frame(
      animal = c("dog", "dog", "dog", "cat", "cat", "fish", "fish", "fish"),
      breed = c("retriever", "husky", "husky", "grey", "white", "guppy", "betta", "betta"),
      count = c(4, 3, 7, 8, 9, 2, 12, 1),
      stringsAsFactors = FALSE
    )
    
    library(dplyr)
    
    pets %>%
      group_by(animal, breed) %>%
      summarise(avg = mean(count)) %>%
      right_join(pets, by = c("animal", "breed")) %>%
      arrange(animal, desc(avg), desc(count)) %>%
      select(-avg) %>%
      ungroup
    
    # # A tibble: 8 x 3
    #   animal     breed count
    #    <chr>     <chr> <dbl>
    # 1    cat     white     9
    # 2    cat      grey     8
    # 3    dog     husky     7
    # 4    dog     husky     3
    # 5    dog retriever     4
    # 6   fish     betta    12
    # 7   fish     betta     1
    # 8   fish     guppy     2
    

    【讨论】:

    • 这个解决方案比我之前的解决方案要优雅得多。但是,运行这个确切的代码我得到了错误:Error: 'by' can't contain join column 'animal', 'breed' which is missing from LHS' 逐行运行,这似乎出现在 right_join()
    • 解决了我上一条评论中提出的错误。问题是plyr 在我的命名空间中的dplyr 之前加载,导致summarise 结果只有一个平均值,而不是来自group_by 的每个组的平均值。在这里偶然发现:stackoverflow.com/questions/26923862/…
    猜你喜欢
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    相关资源
    最近更新 更多