split-apply-combine:在 R 中对多个变量进行排序和分组
split-apply-combine: sorting and grouping multiple variables in R
我正在尝试根据两类数据之间的连续变量对数据框进行排序。具体来说,我想对连续变量进行排序(降序),但将相似类型的变量保存在一起。这是一个例子:
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))
目前,数据框未排序。我想对其进行排序,以便首先显示具有最高均值 count
的 breeds
,但所有 breed
(和 animal
)保持分组在一起。如果我根据 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)))
哪个returns
cat.white cat.grey dog.husky dog.retriever fish.betta fish.guppy
9.0 8.0 5.0 4.0 6.5 2.0
当然,我得到了它们进入的正确顺序。但实际上我什至不关心方法,我只需要根据原始数据框进行排序对此。接下来是根据品种再次拆分这个兔子洞,但随后我将根据列表列表的数据框的列进行排序。这听起来太复杂了。我也试过 order
计数,然后将其从 dplyr
传送到 group_by()
,但这并没有让我比现在走得更远。
感谢您的帮助!
您可以先对组进行排序,然后按照您的预期顺序将其加入到原始集合中。
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
我正在尝试根据两类数据之间的连续变量对数据框进行排序。具体来说,我想对连续变量进行排序(降序),但将相似类型的变量保存在一起。这是一个例子:
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))
目前,数据框未排序。我想对其进行排序,以便首先显示具有最高均值 count
的 breeds
,但所有 breed
(和 animal
)保持分组在一起。如果我根据 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)))
哪个returns
cat.white cat.grey dog.husky dog.retriever fish.betta fish.guppy
9.0 8.0 5.0 4.0 6.5 2.0
当然,我得到了它们进入的正确顺序。但实际上我什至不关心方法,我只需要根据原始数据框进行排序对此。接下来是根据品种再次拆分这个兔子洞,但随后我将根据列表列表的数据框的列进行排序。这听起来太复杂了。我也试过 order
计数,然后将其从 dplyr
传送到 group_by()
,但这并没有让我比现在走得更远。
感谢您的帮助!
您可以先对组进行排序,然后按照您的预期顺序将其加入到原始集合中。
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