【问题标题】:How to connect across multiple consecutive missing data values using geom_line?如何使用 geom_line 连接多个连续的缺失数据值?
【发布时间】:2020-01-25 09:16:22
【问题描述】:

我有一个与 Q 类似的问题:使用 geom_line 连接缺失值,但发现提供的答案仅在只有一个缺失值时才连接线。如果有 2+ 个连续缺失值,则提供的解决方案不适用。

我需要将随着时间的推移对单个树木所做的多个观察结果联系起来。有时会丢失测量值,导致我的 df 中缺少值,有时会连续一年以上丢失一棵树,从而有多个连续的 NA。

当只有一个连续的 NA 时,使用带有此规范的 geom_line 可以连接缺失值:

geom_line(data = df[!is.na(df$y),])

当有多个连续的 NA(即错过 2 个测量值)时,geom_line 将不会绘制丢失的数据。将 !is.na 应用于整个 df 并不能解决问题,使用 geom_path 也不能。

这是生成复制问题的 df 的代码:

x <- c(1,2,3,4,5,6,7,8,9)
tr1 <- c(20,25,18,16,22,12,NA,15,45)
tr2 <- c(12,NA,NA,NA,30,48,30,NA,NA)
df <- data.frame(x, tr1,tr2)

以下代码可用于绘制 a) 缺少 NA 的 tree1,b) 带有 NA 桥接的 tree1,b) 代码中带有 geom_line 校正但缺少跨 NA 的预期线的 tree2

tree1 <- ggplot(df, aes(x, tr1)) + geom_point() +
  geom_line()
tree1.fix <- ggplot(df, aes(x, tr1)) + geom_point() + 
  geom_line(data = df[!is.na(df$tr1),])
nofix <- ggplot(df, aes(x, tr2)) + geom_point() +
  geom_line(data = df[!is.na(df$tr2),])
grid.arrange(tree1, tree1.fix, nofix, ncol = 3)

有什么想法吗?

【问题讨论】:

    标签: dataframe ggplot2 na


    【解决方案1】:

    geom_line() 不会连接任何丢失的数据 (NA)。 geom_point() 也不会绘制缺失数据。这是丢失数据的正确默认行为。 NA 不能放在数值轴上。

    您对df[!is.na(df$tr2),] 所做的事情是在将丢失的数据发送到geom_line() 之前删除,从而误以为您的数据是完整的。 为了更好地理解这一点,请打印出df[!is.na(df$tr2), c("x", "tr2")]。这就是geom_line() 收到的数据。所有这些数据都被显示和连接。该数据中没有 NA,因为您删除了它们。

    在您的“nofix”示例中,您会得到一条从 x=1 到 x=5 的线,超过三个连续的 NA。 所以我假设你的意思是geom_line() 在 x=7 之后不会继续? 但是看看数据。 x=7 后没有数据。每个 x>7 都有 y=NA。而如果去掉 NA,那么 x=7 之后就没有数据了。

    如果您的示例还有一个点,例如 x=10 y=10,那么这条线将从 x=7 继续到 x=10。

    【讨论】:

    • 感谢您运行它来检查 cymon。你是对的——“没有修复”的例子正在处理这个删节的例子......不知道为什么昨晚没有为我做同样的代码。有趣的是,当我在我的大数据集上运行这段代码(即一次绘制大约 1000 棵树)时,它似乎无法计算移除的 NA 之间的所有线路连接,但是当一次子集到 10-50 棵树时情节很好。
    • 就像我已经说过的,geom_line() 永远不会跨 NA 连接。如果存在缺失数据,它将中断该位置的行。您在“修复”中所做的是删除缺少数据的行,因此geom_line() 永远不知道它们存在。因此,如果在您的大图中,您的线条被打断,这意味着您的数据框仍然包含丢失的数据。在 ggplot 之外过滤您的 df 并在过滤后的 df 上运行一些诊断。寻找NAs、NULLs、NaNs、Infs...
    • 您可能还想查看complete.cases(df) 函数,而不是手动过滤所有不同类型的非值。
    • 是的,理解并运行了一堆检查。所有 !complete.cases 都是 NA,我在 geom_line 中使用我们上面讨论过的代码适当地过滤掉了它们。问题(!!)是我应用了一个 ylim 来切断一些点。而不是绘制超出图形空间的线条 geom_line 只是不会为超出轴限制的那些点绘制线条。为帮助我排除西蒙的一些事情而欢呼
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 2015-12-18
    • 2019-08-22
    • 2016-01-17
    相关资源
    最近更新 更多