У меня есть 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 году будут «Действие: 3», «Стрелялка»: 3, «РПГ»: 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))
}

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

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

1
madewellmusic 15 Апр 2020 в 20:54

2 ответа

Лучший ответ

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

xtabs(Sales ~ Year + Genre, df1)
1
akrun 15 Апр 2020 в 17:58

Вот базовое решение 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

< Сильный > DATA

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
ThomasIsCoding 15 Апр 2020 в 18:04