Выбор 10 имен на основе 10 самых больших чисел другого столбца - PullRequest
0 голосов
/ 07 мая 2019

Я хочу выбрать лучшие 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 ]

1 голос
/ 09 мая 2019

Еще один простой подход с использованием базовых функций для создания другой переменной:

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")
0 голосов
/ 07 мая 2019

Более эффективно, хотя и менее читабельно, использовать базовые функции:

#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
0 голосов
/ 07 мая 2019

Я не вижу набора данных для использования, поэтому вот минимальный пример, чтобы показать, как он может работать:

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 также работает в этом случае, но предназначена для сгруппированных данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...