我开始尝试复制我在一个研究中看到的一个图表。然而,在尝试过程中,我对它的创建方式感到困惑。
图表看起来是这样的:
图表中的“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()
如果您想要一个图例,并且希望所有几何对象都相同(即都是线和/或都是点),您可以使用tidyr
包中的gather()
将数据转换为长格式,然后在绘图中更改group
和color
/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()