Агрегирование данных в фрейме данных R - PullRequest
1 голос
/ 15 апреля 2020

У меня есть CSV-файл, подобный приведенному ниже:

Имя - Год - Жанр - Продажи

1 - 2005 - Действие - 1

2 - 2005 - Действие - 2

3 - 2005 - Стрелок - 3

4 - 2006 - РПГ - 2

5 - 2006 - РПГ - 2

6 - 2007 - Действие - 1

7 - 2007 - Стрелок - 3

8 - 2007 - РПГ - 2

...

Моя конечная цель - сделать песочная диаграмма в R, которая показывает общие продажи каждого жанра по оси y и года по оси x с метками, являющимися жанрами.

Мне нужно суммировать продажи каждого из жанров за год, например, продажи в 2005 году будут такими: Action: 3, Shooter: 3, RPG: 0. И делайте это каждый год.

Это в конечном итоге даст мне фрейм данных, который выглядит следующим образом:

 Action  Shooter  RPG  

2005 3 3 0

2006 0 0 4

2007 1 3 2

В Python я мог бы сделать это с помощью enumerate, но мне трудно разобраться с этим в R.

Вот что я до сих пор

vg <- read.csv("vgdata.csv")

genres <- unique(vg$Genre)
years <- sort(unique(vg$Year))

genredf <-data.frame(vg$Genre)
i<-0
for (year in (unique(vg$Year))) {
  yeardata = rep(0,length(genres))
}

Это даст мне фрейм данных с нулями в нем. Теперь я пытаюсь добавить суммирование данных, чтобы можно было составить график.

Извините за плохое форматирование. Я все еще новичок в переполнении стека.

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Вот базовое решение R с использованием reshape + aggregate (но, похоже, не так просто, как подход xtabs @ akrun )

dfout <- reshape(aggregate(Sales~Year + Genre,df,sum),
                 direction = "wide",
                 idvar = "Year",
                 timevar = "Genre")

, такой, что

> dfout
  Year Sales.Action Sales.RPG Sales.Shooter
1 2005            3        NA             3
2 2007            1         2             3
3 2006           NA         4            NA

ДАННЫЕ

df <- structure(list(Name = 1:8, Year = c(2005L, 2005L, 2005L, 2006L, 
2006L, 2007L, 2007L, 2007L), Genre = c("Action", "Action", "Shooter", 
"RPG", "RPG", "Action", "Shooter", "RPG"), Sales = c(1L, 2L, 
3L, 2L, 2L, 1L, 3L, 2L)), class = "data.frame", row.names = c(NA, 
-8L))
1 голос
/ 15 апреля 2020

Мы могли бы использовать xtabs

xtabs(Sales ~ Year + Genre, df1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...