在R矩阵列表中的每个矩阵中绘制一列

时间:2018-08-21 15:34:29

标签: r matrix ggplot2

我在编程和数据分析方面还很陌生,请在此耐心等待。我的数据当前包含14个矩阵(lom)的列表,每个矩阵对应于一个国家/地区的数据(带有两个字母的国家/地区代码)。

以下是奥地利的完整样本:

> lom["AT"]
$`AT`
   Year    AllKey    AllSub    SelKey    SelSub
1  2000  1.622279 0.5334964  1.892894 0.8057591
2  2001  1.903745 0.5827514  2.291335 0.8295899
3  2002  1.646538 0.4873866  2.006873 0.7360566
4  2003  1.405250 0.8692641  2.105648 1.2711968
5  2004  1.511154 1.5091751  1.970236 1.9407666
6  2005  1.459177 0.6781008  1.808982 1.1362805
7  2006  1.604652 0.5038658  1.942126 0.7992008
8  2007  2.107326 0.9260200  2.683072 1.3302627
9  2008  1.969735 0.6178362  2.994758 1.2051339
10 2009  1.955768 0.7365529  2.896198 1.2272024
11 2010  2.476157 0.7952590  3.715950 1.5686643
12 2011  2.092459 0.4970011  2.766169 0.6476707
13 2012  1.913122 0.5338756  2.450942 0.6022315
14 2013  2.086200 0.6739412  2.786736 0.9211941
15 2014  2.579428 0.8424793  3.152541 1.0225888
16 2015 10.662568 5.8472436  9.769320 3.8840780
17 2016 11.088286 4.6504581 10.567789 3.2383420
18 2017  7.225053 1.7528594  6.747515 1.2781224

我想针对x = Year和y =每个其他变量绘制所有14个国家/地区,即四个具有14条线的地块。因此,问题标题中的要求。

我不断提出不可能,涉及到for循环和某些apply函数的某种组合,例如:

for (i in colnames(lom$anyCountry)) {
    ggplot(lapply(lom, function(x) x[,1:14], aes(x=Year, y=i)   
}

除了我现在可以看到的许多其他问题外,

  

错误:data必须是数据帧或fortify()可强制执行的其他对象,而不是列表

这导致我将矩阵列表合并为一个受启发的大矩阵 this

bigDF <- do.call(rbind, lom)

我想我可以用其他方式重组数据,也许我缺少一些可以帮助……的功能。对于如何尽可能有效地实现这一目标,我将不胜感激。

2 个答案:

答案 0 :(得分:0)

考虑将所有矩阵数据附加到具有 country 指示符的主单个数据帧中,该指示符可用于线图的color参数:

# CREATE LARGE DATAFRAME FROM MATRIX LIST
lom_df <- do.call(rbind, lapply(lom, data.frame))

# CREATE COLUMN NAMES FROM ROWNAMES
lom_df$country <- gsub("\\..*$", "", row.names(lom_df))
row.names(lom_df) <- NULL

# EXTRACT ALL FOUR Y COLUMN NAMES (MINUS Year AND country)
y_columns <- colnames(lom_df[2:(ncol(lom_df)-1)])

# PRODUCE LIST OF FOUR PLOTS EACH WITH COUNTRY LINES
plot_list <- lapply(y_columns, function(col)
  ggplot(lom_df, aes_string(x="Year", y=col, color="country")) +
     geom_line()
)

# OUTPUT EACH LIST 
plot_list

答案 1 :(得分:0)

此解决方案使用软件包df

它有两个步骤,数据准备和绘图。

首先,必须将列表转换为一个大数据帧,并将其列作为id列。我已经在SO中搜索了一个可以执行此操作的函数,但是找不到它,所以就去了。

ggplot2

现在,将数据帧的形状从宽变长。

rbindWithID <- function(x, id.name = "ID", sep = "."){
    if(is.null(names(x))) names(x) <- paste(id.name, seq_along(x), sep = sep)
    res <- lapply(names(x), function(nm){
        DF <- x[[nm]]
        DF[[id.name]] <- nm
        x[[nm]] <- cbind(DF[ncol(DF)], DF[-ncol(DF)])
        x[[nm]]
    })
    do.call(rbind, res)
}

lom_df <- rbindWithID(lom, "Country")

最后,绘制它。

molten <- reshape2::melt(lom_df, id.vars = c("Country", "Year"))

enter image description here

数据。

library(ggplot2)

ggplot(molten, aes(Year, value, colour = Country)) +
    geom_line() +
    facet_wrap(~ variable)
相关问题