在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

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

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