我在 R 中拥有以下数据框(对于熟悉 tidyverse 的人来说,这是 starwars 示例数据集)
我正在尝试创建一个输出两列的 tibble:homeworld
和 shortest_5
(来自该 homeworld 的最矮 5 个人的平均高度)。
下面是我的代码;
df<-starwars %>%
group_by(homeworld) %>%
filter(!is.na(height), !is.na(homeworld)) %>%
arrange(desc(height)) %>%
mutate(last5mean = mean(tail(height, 5))) %>%
summarize(shortest_5=last5mean, number=n()) %>%
filter(number>=5, )
df
看来我已经成功地做到了(虽然很困惑)。我的问题是,虽然我的 tibble 确实列出了 homeworld
和 shortest_5
,但它重复了同一 homeworld
的多个实例。
似乎是一个简单的修复,但我无法完全理解它!任何帮助将不胜感激!
最佳答案
您可以大大缩短代码:
df<-starwars %>%
group_by(homeworld) %>%
filter(!is.na(height), !is.na(homeworld), n() >=5) %>%
summarize(shortest_5 = mean(if_else(rank(height) > 5, NA_integer_, height), na.rm = TRUE))
df
# # A tibble: 2 x 2
# homeworld shortest_5
# <chr> <dbl>
# 1 Naboo 151.
# 2 Tatooine 153.
注意:
- 我得到的结果与你不同,例如在 Naboo 上,最短的 5 个字符的高度为:96、157、165、165、170。这 5 个值的平均值是 150.6。
- 您不应该拥有以下值:科洛桑,因为来自那个家乡的角色只有 3 个。仅有的两个至少有 5 个角色的家园世界是纳布和塔图因。
关于r - 如何删除R中的重复行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66118827/