r - 具有最新可用观测值的散点图

标签 r ggplot2

我发现根据每个变量的最新可用观察结果创建散点图存在一些问题。我想获取每个变量和每个国家的最新观测值,然后计算散点图。我创建了一个带有随机数的简短示例,以表明在我的基础设施中,由于 df 表中缺少观察结果,某些国家/地区丢失了。对于 NL 和 FR,该图表应采用 2019q1。

library(zoo)
library(ggplot2)
library(ggrepel)
library(data.table)


# scatterplot preparation
set.seed(123)
country <- c("AT", "BE", "NL", "DE", "FR", "IT", "ES", "PT", "AT", "BE", "NL", "DE", "FR", "IT", "ES", "PT")
year <- as.yearqtr(c("2019 Q1", "2019 Q1","2019 Q1", "2019 Q1", "2019 Q1", "2019 Q1", "2019 Q1", "2019 Q1", "2019 Q2", "2019 Q2", "2019 Q2", "2019 Q2", "2019 Q2", "2019 Q2", "2019 Q2", "2019 Q2"))

HPG <- runif(16, min=0, max=5)

HAR <- runif(16, min=-1, max=3)
HAR[c(11,13)] <- NA

df <- data.frame(country, year, HPG, HAR)
df <- as.data.table(df)

df2019q2 <- df[df$year == "2019 Q2"]

ggplot(data = df2019q2, aes(x = HAR, y = HPG, label = country)) + 
  geom_point(colour = "blue") +
  geom_label_repel(aes(label = country),
                   box.padding   = 0.35, 
                   point.padding = 0.5,
                   segment.color = 'grey50') +
 theme_bw() + 
guides(linetype = FALSE, size = FALSE) + 
  scale_y_continuous(name = "HPG", breaks = scales::pretty_breaks(n = 10), limits = c(-6, 4)) +
  scale_x_continuous(name = "HAR", breaks = scales::pretty_breaks(n = 10))

最佳答案

答案取决于您是想仅用以前的信息替换缺失的值,还是使用上季度的所有值。以下是使用 data.table 和/或 zoo 的解决方案。

第一个场景 - 对所有列取上季度的数据(即您的情况下的 HARHPG):

df2019q2 <- na.omit(df)[order(year), ][, .SD[.N], by = country]

在此,我们首先使用 na.omit 删除所有缺失值的行,然后按 年份 进行排序,最后但并非最不重要的一点是我们采用数据子集 (.SD),其中仅采用每个国家/地区 的最后一行 (.N)(如 @Uwe 建议) ,您还可以使用 last(.SD) 获取最后一行并将其缩短为 na.omit(df)[order(year), last(.SD), by = Country ]

情节如下:

enter image description here

第二种情况 - 分别对每列进行最后一次观察,例如我们为 2019Q2 保留 MPG,为 2019Q1 保留 HAR

您可以使用 zoo 中的 na.locfHPGMPG 中继续进行最后的观察列,例如:

df2019q2 <- df[, c("HPG", "HAR") := lapply(.SD, na.locf), by = country, .SDcols = c("HPG", "HAR")][year == "2019 Q2"]

这将给出以下情节:

enter image description here

这当然假设您希望用任何上一季度具有非缺失值的信息替换缺失值。例如,如果您缺少 2019Q22019Q1 的信息,但 2018Q4 中存在非缺失值,它们都会从以下位置获取值2018Q4

重要:在这两种情况下,您都需要调整 ggplot 代码以扩大限制(否则您会再次丢失信息) - 我已替换 c(-6, 4) c(-6, 6):

ggplot(data = df2019q2, aes(x = HAR, y = HPG, label = country)) + 
  geom_point(colour = "blue") +
  geom_label_repel(aes(label = country),
                   box.padding   = 0.35, 
                   point.padding = 0.5,
                   segment.color = 'grey50') +
  theme_bw() + 
  guides(linetype = FALSE, size = FALSE) + 
  scale_y_continuous(name = "HPG", breaks = scales::pretty_breaks(n = 10), limits = c(-6, 6)) +
  scale_x_continuous(name = "HAR", breaks = scales::pretty_breaks(n = 10))

关于r - 具有最新可用观测值的散点图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60027121/

相关文章:

r - 为什么 coord_map 会产生奇怪的输出?

r - 使用 R 中的 Rayshader 在高度 3D map 上添加颜色

c++ - 在 Rcpp 中用随机生成的值填充 vector 的一部分

r - 仅访问生存对象的一部分

r - R中多个术语的findAssocs

r - 如何在 ggplot2 主题 (ggtheme) 中设置默认线条大小?

r - 使用效果包自定义绘图

r - 仅填充(扩展)ggplot2 中连续刻度的顶部

r - 处理 R 中的字节顺序标记 (BOM)

r - 两个日期之间的差异,不包括周末