我想选择投票率最高的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
然后是显示这些餐厅名称及其票数的条形图
答案 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