我想要一种有效的方法来绘制具有缺失值的数据帧作为 R 中的线图,根据以下基本原理;
- 第一个和最后一个值中的 NA 被完全省略(没有线/点)
- 实际值内的 NA 被替换为线图的中间值(不出现点)
这是我的数据框示例(已编辑)
df <- data.frame("time" = c(1,2,3,4,5),
"case1" = c(NA,2,3,4,NA),
"case2" = c(5,4,3,2,NA),
"case3" = c(4,NA,NA,NA,2))
这只是第一种情况下的工作方式
library(pracma)
df$case1.i <- with(df, interp1(time, case1, time, 'linear'))
library(ggplot2)
ggplot(df, aes(time)) + geom_point(aes(case1 = case1)) + geom_line(aes(case1 = case1.i))
我正在尝试解决一些问题,使其适用于我实际数据框中的大约 200 列。到目前为止,这段代码似乎不起作用
for (i in colnames(df)){
argument <- paste("df$case",i,".i <- with(df, interp1(time, case",i,", time, 'linear'))")
eval(parse(text=argument))
}
最佳答案
将数据读入一个新的动物园对象 z
,对其应用 na.approx
以填充 NA
主体内的值数据,然后使用 ggplot2 绘图。如果需要单独的面板,请省略 facet = NULL
。请注意,带有 melt = TRUE
的 fortify.zoo
将数据转换为带有 Index
、Series
和 的长格式>Value
列,用于 geom_point
。如果您只需要线条,请省略 geom_point(...)
部分。请参阅此答案末尾的图片。此处显示的方法相对紧凑,避免粘贴在一起然后评估代码。
library(ggplot2)
library(zoo)
z <- read.zoo(df)
autoplot(na.approx(z), facet = NULL) +
geom_point(aes(Index, Value, group = Series), fortify(z, melt = TRUE))
或者如果你想为每列绘制一个单独的图,试试这个:
pdf("civy.pdf")
for(i in 1:ncol(z)) {
p <- autoplot(na.approx(z[, i])) +
ylab(names(z)[i]) +
geom_point(aes(Index, Value), fortify(z[, i], melt = TRUE))
plot(p)
}
dev.off()
关于r - 在 R 图中快速插入缺失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53630765/