我发现根据每个变量的最新可用观察结果创建散点图存在一些问题。我想获取每个变量和每个国家的最新观测值,然后计算散点图。我创建了一个带有随机数的简短示例,以表明在我的基础设施中,由于 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
的解决方案。
第一个场景 - 对所有列取上季度的数据(即您的情况下的 HAR
和 HPG
):
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 ]
。
情节如下:
第二种情况 - 分别对每列进行最后一次观察,例如我们为 2019Q2
保留 MPG
,为 2019Q1
保留 HAR
。
您可以使用 zoo
中的 na.locf
在 HPG
和 MPG
中继续进行最后的观察列,例如:
df2019q2 <- df[, c("HPG", "HAR") := lapply(.SD, na.locf), by = country, .SDcols = c("HPG", "HAR")][year == "2019 Q2"]
这将给出以下情节:
这当然假设您希望用任何上一季度具有非缺失值的信息替换缺失值。例如,如果您缺少 2019Q2
和 2019Q1
的信息,但 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/