Как создать временные ряды для каждой строки фрейма данных с безымянным первым столбцом

#r #ggplot2 #time-series

Вопрос:

Так что это, я уверен, довольно элементарная проблема. У меня есть фрейм данных, содержащий данные за 10 лет по нескольким странам. Это выглядит так. Фрейм данных-df.

                     X2003 X2004 X2005 X2006 X2007 X2008 X2009 X2010 X2011 X2012
Afghanistan         7.321 7.136 6.930 6.702 6.456 6.196 5.928 5.659 5.395 5.141
Albania             2.097 2.004 1.919 1.849 1.796 1.761 1.744 1.741 1.748 1.760
Algeria             2.412 2.448 2.507 2.580 2.656 2.725 2.781 2.817 2.829 2.820
Angola              6.743 6.704 6.657 6.598 6.523 6.434 6.331 6.218 6.099 5.979
Antigua and Barbuda 2.268 2.246 2.224 2.203 2.183 2.164 2.146 2.130 2.115 2.102
Argentina           2.340 2.310 2.286 2.268 2.254 2.241 2.228 2.215 2.201 2.188
 

Первый столбец-метаданные. У него нет названия. Я хотел бы использовать qplot для построения временных рядов для каждой из строк. Что-то вроде следующей команды:

 library(ggplot2)
qplot (data = df, binwidth = 1, geom="freqpoly") but I get the following error

Error: stat_bin requires the following missing aesthetics: x. 
 

Я хотел бы установить x = первый столбец, но у меня нет имени в этом столбце. Нужно ли мне создавать первую колонку названий стран? Если да, то как мне это сделать?
Похоже, должен быть более простой способ. Извините, если это так элементарно.

Ответ №1:

Не уверен, что вам нужно, может быть, что-то вроде этого?

 library(reshape2)
library(ggplot2)
df$metadata <- row.names(df)
df <- melt(df, "metadata")
ggplot(df, aes(variable, value, group = metadata, color = metadata))  
  geom_line()
 

введите описание изображения здесь

Комментарии:

1. Извините, это не совсем то, что я искал. Я предполагаю, что это не частотный полигон, а временной ряд. Я хочу построить ежегодные серии для каждой страны с течением времени. Поэтому для Афганистана я хотел бы увидеть значение в 2000 году, затем значение в 2001 году и т. Д…

2. @CharlesFogel, смотрите мое обновление, используя ваши данные. На самом деле здесь нет ничего особенного, просто используйте melt один раз

Ответ №2:

следуя вашим комментариям, я думаю, вам нужна такая графика?

 # Create a "long" data frame rather than a "wide" data frame.

country <- rep(c("Afghanistan", "Albania", "Algeria","Angola",
             "Antigua and Barbuda", "Argentina"),each = 10, times = 1)
year <- rep(c(2003:2012), each = 1, times = 6)
value <- runif(60, 0, 50)

foo <- data.frame(country,year,value,stringsAsFactors=F)
foo$year <- as.factor(foo$year)

# Draw a ggplot figure

ggplot(foo, aes(x=year, y = value,group = country, color = country))  
    geom_line()  
    geom_point()
 

Комментарии:

1. Ага. Это дает временные ряды для каждой страны. Но ничего себе, хотя это кажется сложным. У меня уже есть данные в каждой строке для каждой страны. Разве нет способа построить график с каждым столбцом в виде галочки на оси x?

2. Что вы имеете в виду, говоря «тик»? Не могли бы вы запустить следующее и посмотреть, это ли вы имеете в виду? ggplot(foo, aes(x=year, y = value,group = country, color = country, shape = country)) geom_point()

3. Нет. Ваше первое решение было правильным. Это просто требует большого количества манипуляций с данными, которые я не понимаю.

4. Если ваши данные те, которые вы изначально показывали, Дэвид показал вам, как преобразовать «широкий» фрейм данных в «длинный» фрейм данных. Вы хотите использовать melt() в reshape2 упаковке. Это сделает всю работу за вас. Если ваши данные в другом формате, возможно, вы захотите задать другой вопрос, связанный с этим.

5. Спасибо. Я посмотрю, что там.

Ответ №3:

Привет. Вот очень похожее решение на то, что Чарльз правильно предложил использовать melt. Я использовал пакет ggvis для создания графика и убедился, что масштаб оси y зафиксирован на 0. В приведенном ниже блоке кода предполагается, что df уже считывается в R.

Код R:

 
    library(reshape2)
    library(ggvis)

    str(df) # just to demonstrate initial structure of df....results in coment block below

    # data.frame': 6 obs. of  11 variables:
    #  $ Country: chr  "Afghanistan" "Albania" "Algeria" "Angola" ...
    #  $ X2003  : num  7.32 2.1 2.41 6.74 2.27 ...
    #  $ X2004  : num  7.14 2 2.45 6.7 2.25 ...
    #  $ X2005  : num  6.93 1.92 2.51 6.66 2.22 ...
    #  $ X2006  : num  6.7 1.85 2.58 6.6 2.2 ...
    #  $ X2007  : num  6.46 1.8 2.66 6.52 2.18 ...
    #  $ X2008  : num  6.2 1.76 2.73 6.43 2.16 ...
    #  $ X2009  : num  5.93 1.74 2.78 6.33 2.15 ...
    #  $ X2010  : num  5.66 1.74 2.82 6.22 2.13 ...
    #  $ X2011  : num  5.39 1.75 2.83 6.1 2.12 ...
    #  $ X2012  : num  5.14 1.76 2.82 5.98 2.1 ...

    df1 <- melt(df, "Country")

    df1 %>% ggvis(~factor(variable),~value,stroke=~Country) %>% layer_lines(strokeWidth:=2.5) %>% 
    add_axis("x",title="Year") %>% scale_numeric("y",zero=TRUE) 
 

Я никогда по-настоящему не начинал использовать ggplot, но когда я увидел ggvis и особенно его использование оператора %>% pipe, представленного в пакете magrittr, я был зацеплен. Лучшие….

Комментарии:

1. Спасибо вам за такой интересный подход.