split-apply-combine:对R中的多个变量进行排序和分组

问题描述 投票:1回答: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))

现在,数据框未排序。我想对它进行排序,使得具有最高平均值breedscount首先出现,但所有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

当然,我已经得到了正确的顺序。但我实际上并不关心这些方法,我只需要根据这个来对原始数据框进行排序。接下来是基于品种再次分裂这个兔子洞,但后来我将根据列表列表的数据框列进行排序。这听起来太复杂了。我也尝试过ordering计数,然后从group_by()把它传到dplyr,但这并没有让我比现在更远。

谢谢你的帮助!

r sorting dplyr plyr
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.