r - 在 R 图中快速插入缺失值

标签 r dataframe ggplot2

我想要一种有效的方法来绘制具有缺失值的数据帧作为 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 = TRUEfortify.zoo 将数据转换为带有 IndexSeries 的长格式>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()

screenshot

关于r - 在 R 图中快速插入缺失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53630765/

相关文章:

pandas - 两个日期列之间的年份 = 'Timedelta' 对象没有属性 'item'

python - Biopython 给出 ValueError : Sequences must all be the same length even though sequences are of the same length

r - 如何在不同的ggplot类型之间切换?

r - 将所有列转换为 data.frame 中的字符

R:在多个列中查找模式 - 可能是重复的()?

r - 如何在R中的数据框中组合两列?

r - 为 geom_polygon 添加图例

r - 单个水平行中的ggplot2图例项

r - 如何通过另一个变量对 data.frame 的列进行排序

mysql - 如何使用 R 将列表放入数据库