在R中生成用于创建图表的数据

我开始尝试复制我在一个研究中看到的一个图表。然而,在尝试过程中,我对它的创建方式感到困惑。

图表看起来是这样的:

enter image description here

图表中的“x”代表具有特定分数的国家的百分比(比如所有分数等于1的国家)。两条线代表另外两个独立变量的百分比。

我知道数据集大致是这样的(这只是一个样本——与我的数据集结构非常相似)。

country year    x1  x2  scoreA       1990    0   0   0A       1991    1   0   1A       1992    1   0   1A       1993    0   0   0A       1995    1   0   0A       1996    1   0   2A       1997    1   0   0B       1990    0   0   0B       1991    0   0   0B       1992    0   0   1B       1993    0   0   2B       1995    0   1   2B       1996    0   0   2B       1997    0   1   2C       1990    0   1   2C       1991    1   1   0C       1992    1   0   0C       1993    1   0   0C       1995    1   0   0C       1996    0   0   1C       1997    0   0   1C       1998    1   1   0D       1990    0   0   2D       1991    0   0   2D       1992    1   1   2D       1993    1   1   0D       1995    0   0   1D       1996    0   0   1D       1997    0   0   1

如上所示,score变量是一个序数变量,值为0、1和2。我希望创建一个数据框,以便以与上图类似的方式绘图。这就是我感到困惑的地方,不知道该如何继续。我下面的问题是基于我需要做以下操作来绘制类似图表的假设。

如何计算分数等于0的国家的百分比,以及这些国家中x1和x2的相应百分比?

最终,我需要对分数等于1和分数等于2的国家进行相同的计算。

我需要一些建议——所以我非常感谢所有建议!


回答:

计算某种条件的百分比(例如,分数等于0的百分比)的简单方法是使用mean(condition) * 100。这里有一篇详细的博客文章介绍了这种方法:https://drsimonj.svbtle.com/proportionsfrequencies-with-mean-and-booleans。请注意,如果有缺失值,请使用mean(condition, na.rm = TRUE) * 100

我将从模拟数据开始,这些数据大致与您提供的数据相匹配:

set.seed(987)d <- data.frame(  year  = rep(c(1991:2000), each = 10),  x1    = sample(c(0, 1, 2), 100, replace = TRUE),  x2    = sample(c(0, 1, 2), 100, replace = TRUE),  score = sample(c(0, 1, 2), 100, replace = TRUE))head(d)#>   year x1 x2 score#> 1 1991  1  2     2#> 2 1991  2  1     2#> 3 1991  1  1     2#> 4 1991  1  0     2#> 5 1991  2  0     0#> 6 1991  0  0     1

然后,您可以使用dplyr包中的group_by(year)summarise(...)来计算每年观察到特定分数的百分比:

library(dplyr)to_match <- 0d <- d %>%  group_by(year) %>%   summarise(    x1    = mean(x1 == to_match) * 100,    x2    = mean(x2 == to_match) * 100,    score = mean(score == to_match) * 100  )d#> # A tibble: 10 x 4#>     year    x1    x2 score#>    <int> <dbl> <dbl> <dbl>#> 1   1991    10    60    30#> 2   1992    60    20    30#> 3   1993    40    40    30#> 4   1994    40    50    50#> 5   1995    50    50    20#> 6   1996    30    40    20#> 7   1997    20    30     0#> 8   1998    20    60    40#> 9   1999    40    30    20#> 10  2000    20    40    40

请注意,我只是将to_match变量设置为0。您可以将其更改为1和2以获取其他值。

然后,您可以使用ggplot2进行绘图,类似于以下代码:

library(ggplot2) d %>%   ggplot(aes(x = year)) +    scale_x_continuous(breaks = 1991:2000) +    geom_line(aes(y = x1)) +    geom_line(aes(y = x2), color = "grey") +    geom_point(aes(y = score)) +    scale_y_continuous(limits = c(0, 100)) +    ylab("Percent Countries") +    theme_bw()

enter image description here

如果您想要一个图例,并且希望所有几何对象都相同(即都是线和/或都是点),您可以使用tidyr包中的gather()将数据转换为长格式,然后在绘图中更改groupcolor/linetype美学属性以匹配。这里有一个例子:

library(tidyr)d %>%   gather(-year, key = "var", value = "Percent") %>%   ggplot(aes(x = year, y = Percent, group = var)) +    scale_x_continuous(breaks = 1991:2000) +    geom_line(aes(linetype = var, color = var)) +    geom_point(size = 2) +    scale_y_continuous(limits = c(0, 100)) +    ylab("Percent Countries") +    theme_bw()

enter image description here

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注