根据其他列的10个最高编号选择10个名称

时间:2019-05-07 18:30:16

标签: r dplyr

我想选择投票率最高的10家餐厅,然后将它们绘制在一起。 因此,我想创建一个显示餐厅名称及其票数的图。 我用过:

topTenVotes <- top_n(dataSet, 10, Votes) 

它向我显示了基于前10个最高票数的数据集中的列数据,但是我只需要票数和餐厅名称。

我的问题是如何仅选择排名前10位的最高投票及其餐厅名称,然后将其绘制在一起?

预期输出:

Restaurant Names            Votes
A                            300
B                            250 
C                            230  
D                            220
E                            210
F                            205
G                            200
H                            194
I                            160
J                            120
K                             34

然后是显示这些餐厅名称及其票数的条形图

3 个答案:

答案 0 :(得分:1)

使用基本函数创建另一个变量的另一种简单方法:

df <- data.frame(Names = LETTERS, Votes = sample(40:400, length(LETTERS)))
x <- df$Votes
names(x) <- df$Names # x <- setNames(df$Votes, df$Names) is another approach
barplot(sort(x, decreasing = TRUE)[1:10], xlab = "Restaurant Name", ylab = "Votes")

或具有基本功能的单行解决方案:

barplot(sort(xtabs(Votes ~ Names, df), decreasing = TRUE)[1:10], xlab = "Restaurant Names")

答案 1 :(得分:0)

我没有看到要使用的数据集,因此,这是一个最小的示例,说明它如何工作:

library(tidyverse) 

df <- 
  tibble(
    restaurant = c("res1", "res2", "res3", "res4"),
    votes = c(2, 5, 8, 6)
  )

df %>% 
  arrange(-votes) %>% 
  head(3) %>% 
  ggplot(aes(x = reorder(restaurant, votes), y = votes)) +
  geom_col() +
  coord_flip()

在这种情况下,top_n命令也可以使用,但是仅适用于分组数据。

答案 2 :(得分:0)

使用基本函数更有效,但可读性更差

#toy data
d <- data.frame(list(Names = sample(LETTERS, size = 15), value = rnorm(25, 10, n = 15)))
head(d)
  Names     value
1     D 25.592749
2     B 28.362303
3     H  1.576343
4     L 28.718517
5     S 27.648078
6     Y 29.364797
#reorder by, and retain, the top 10
newdata <- data.frame()
for (i in 1:10) {
      newdata <- rbind(newdata,d[which(d$value == sort(d$value, decreasing = T)[1:10][i]),])
}
newdata
   Names    value
8      W 45.11330
13     K 36.50623
14     P 31.33122
15     T 30.28397
6      Y 29.36480
7      Q 29.29337
4      L 28.71852
10     Z 28.62501
2      B 28.36230
5      S 27.64808