Невозможно правильно построить data.frame в r - PullRequest
0 голосов
/ 24 апреля 2020

Я не могу сделать это самостоятельно, пробуя не менее 2 часов ...

У меня есть следующий data.frame, импортированный из CSV-файла:

> asyl_continents
          2010 2011 2012 2013 2014  2015  2016
Europe    1411 1352 2047 3277 5105  7647  5296
Asia      2832 3229 3903 4418 7123 32152 18002
America     20   17   20   27   35    42    97
Africa     436  757  897 1497 3846  5412  4592
Australia    0    0    0    0    0     0     1
stateless   34   34   35   28   80    88   179
unknown    159  160  140  207  360   408   505

Это вывод этого:

structure(list(`2010` = c(1411L, 2832L, 20L, 436L, 0L, 34L, 159L
), `2011` = c(1352L, 3229L, 17L, 757L, 0L, 34L, 160L), `2012` = c(2047L, 
3903L, 20L, 897L, 0L, 35L, 140L), `2013` = c(3277L, 4418L, 27L, 
1497L, 0L, 28L, 207L), `2014` = c(5105L, 7123L, 35L, 3846L, 0L, 
80L, 360L), `2015` = c(7647L, 32152L, 42L, 5412L, 0L, 88L, 408L
), `2016` = c(5296L, 18002L, 97L, 4592L, 1L, 179L, 505L)), class = "data.frame", row.names = c("Europe", 
"Asia", "America", "Africa", "Australia", "stateless", "unknown"
))

Я хочу построить что-то вроде этого: https://i.stack.imgur.com/l7s6l.png На x-achsis должны быть годы и для каждой категории ( Европа, Азия, ..., неизвестно) отдельный ряд.

Хотите знать, что это такое? Для студенческого проекта я хочу показать, что уровень преступности увеличился только в абсолютных цифрах с прибытием большего числа беженцев, но не в относительных цифрах. Хотите позже объединить этот набор данных с криминальными числами.

Ответы [ 3 ]

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

Следующий код не зависит от пакетов не-base-R.

A) graphics::matplot отображает столбцы матрицы, к которой автоматически применяется кадр данных:

matplot(x = as.numeric(colnames(asyl_continents)), # x values: the years
    y    = t(asyl_continents),                 # y values: one column per plotted line each, therefore transpose years' asylum values to columns 
    # col= c(...)                              # could specify your own colors here, as well as line types, thickness etc.
    type = "l",                                # specify type: draw lines, see ? matplot for details
    xlab = "years", ylab = "asylum")

B) legend() добавляет легенду

legend(x="topleft", legend = row.names(asyl_continents), 
       col = seq_len(ncol(asyl_continents)),      # use matplot's default color sequencs, unless spefified otherwise in matplot() (see https://stackoverflow.com/questions/27796583/how-to-add-colour-matched-legend-to-a-r-matplot)
       lwd = 1, cex=0.85)

Вы можете изменить цвета, типы линий и т. Д. c. как хочешь, понимаешь? Матплот для деталей.

enter image description here

0 голосов
/ 24 апреля 2020

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


library(tibble)
library(dplyr)
library(tidyr)
library(stringr)
library(ggplot2)


# Provide a sample of data in a proper dataframe or equivalent object

df <- tibble(cont = c("Europe", "Asia", "America", "Africa", "Australia", "stateless", "unknown"), 
             `2010` = c(1411L, 2832L, 20L, 436L, 0L, 34L, 159L), 
             `2011` = c(1352L, 3229L, 17L, 757L, 0L, 34L, 160L),
             `2012` = c(2047L, 3903L, 20L, 897L, 0L, 35L, 140L), 
             `2013` = c(3277L, 4418L, 27L, 1497L, 0L, 28L, 207L),
             `2014` = c(5105L,7123L, 35L, 3846L, 0L, 80L, 360L),
             `2015` = c(7647L, 32152L, 42L, 5412L, 0L, 88L, 408L), 
             `2016` = c(5296L, 18002L, 97L, 4592L,1L, 179L, 505L))

# in this case it is helpful to put the data in to longer format 
df1 <- 
  df %>% 
  pivot_longer(cols = matches("\\d{4}$"), names_to = "year", values_to = "asyl_nr")

# plot the data
ggplot(df1, aes(year, asyl_nr, colour = cont, group = cont))+
  geom_line()+
  theme_classic()

И вот что вы в итоге получите:

enter image description here

0 голосов
/ 24 апреля 2020

Добро пожаловать в stackoverflow. Пожалуйста, опишите немного больше, что вы хотите, как барплот? Также, пожалуйста, дайте нам вывод dput(asyl_continents), чтобы мы могли напрямую работать с вашим фреймом данных. Следующий код «по памяти», я не тестировал его, но думаю, что буду работать.

Что-то вроде boxplot(asyl_continents)?

по относительному числу, вы имеете в виду увеличение по строке? действительно, это имеет смысл:

df <- asyl_continents
df <- apply(df,1,function(x){1+ (x-x[1])/x[1]})
matplot(t(df))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...