Фильтрация фрейма данных с очень конкретными требованиями - PullRequest
0 голосов
/ 19 марта 2019

Набор данных Fifa2 Во-первых, я не разработчик, и у меня мало опыта работы с R, поэтому, пожалуйста, прости меня. Я пытался сделать это самостоятельно, но у меня не осталось идей для фильтрации фрейма данных с помощью команды filter.

фрейм данных содержит около дюжины столбцов, один из которых - Grp (имеется в виду группа). Это набор данных ФИФА по футболу, поэтому под Группой в этом контексте подразумевается общая позиция игрока (защита, полузащитник, вратарь, нападающий).

Мне нужно отфильтровать этот фрейм данных, чтобы предоставить мне точную информацию: 4 лучших игрока обороны Лучшие 4 игрока полузащиты 2 лучших нападающих Топ 1 Вратарь

Что я подразумеваю под "вершиной"? Это организовано столбцом Grp, который является просто числовым числом. Итак, Top 4 будет выглядеть как 22,21,21,20 (или что-то похожее, потому что это числовое число может фактически повторяться для разных игроков). Столбец «Рост» представляет собой разницу между столбцом «Потенциальный столбец» и «Общий столбец», поэтому снова просто вычтите, чтобы найти разницу между ними.

#Create a subset of the data frame
library(dplyr)
fifa2 <- fifa %>%   select(Club,Name,Position,Overall,Potential,Contract.Valid.Until2,Wage2,Value2,Release.Clause2,Grp) %>% arrange(Club)
#Add columns for determining potential 
fifa2$Growth <- fifa2$Potential - fifa2$Overall
head(fifa2)

#Find Southampton Players
ClubName <- filter(fifa2, Club == "Southampton") %>% 
  group_by(Grp) %>% arrange(desc(Growth), .by_group=TRUE) %>% 
  top_n(4)
ClubName

ClubName2 <- ggplot(ClubName, aes(x=forcats::fct_reorder(Name, Grp),
                                  y=Growth, fill = Grp)) +
  geom_bar(stat = "identity", colour = "black") +
  coord_flip() + xlab("Player Names") + ylab("Unfilled Growth Potential") +
  ggtitle("Southampton Players, Grouped by Position")
ClubName2

На этом графике представлен список игроков, в которых по 4 лучших игрока находятся в каждой позиции (top_n (4)), но мне нужно отфильтровать их по логике, описанной выше. Как мне этого добиться? Я попытался дурачиться с помощью dplyr, и довольно просто получить строки по имени Grp, но не вижу, как их отфильтровать до нужного мне 4-4-2-1. Любая помощь приветствуется.

Пример вывода из fifa2 & ClubName (который показывает данные, отсортированные по top_n (4):

fifa2_Dataset

1 Ответ

0 голосов
/ 19 марта 2019

Возможно, это не самое элегантное решение, но, надеюсь, оно работает:)

# create dummy data
data_test = data.frame(grp = sample(c("def", "mid", "goal", "front"), 30, replace = T), growth = rnorm(30, 100,10), stringsAsFactors = F)

# create referencetable to give the number of players needed per grp
desired_n = data.frame(grp = c("def", "mid", "goal", "front"), top_n_desired = c(4,4,1,2), stringsAsFactors = F)
# > desired_n
# grp top_n_desired
# 1   def             4
# 2   mid             4
# 3  goal             1
# 4 front             2

# group and arrange, than look up the desired amount of players in the referencetable and select them.
data_test %>% group_by(grp) %>% arrange(desc(growth)) %>% 
  slice(1:desired_n$top_n_desired[which(first(grp) == desired_n$grp)]) %>% 
  arrange(grp)

# A bit more readable, but you have to create an additional column in your dataframe

# create additional column with desired amount for the position written in grp of each player
data_test = merge(data_test, desired_n, by = "grp", all.x = T
                  )
data_test %>% group_by(grp) %>% arrange(desc(growth)) %>% 
  slice(1:first(top_n_desired)) %>% 
  arrange(grp)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...