Dataframe 如何使用geom_线连接多个连续缺失的数据值?

Dataframe 如何使用geom_线连接多个连续缺失的数据值?,dataframe,ggplot2,na,Dataframe,Ggplot2,Na,我有一个与Q类似的问题:使用geom_线连接缺失的值,但发现提供的答案仅在缺少一个值时连接线。如果有2+个连续缺失值,则提供的解决方案不适用 我需要连接随着时间的推移对单个树木进行的多个观察。有时测量值丢失,导致我的df中缺少值,有时一棵树连续丢失一年以上,导致有多个连续的NAs 当只有一个连续NA时,使用符合本规范的geom_线可处理跨缺失值的连接: geom_line(data = df[!is.na(df$y),]) 当有一个以上的连续NA(即遗漏2次测量)时,geom_线将不会划过遗漏

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

我需要连接随着时间的推移对单个树木进行的多个观察。有时测量值丢失,导致我的df中缺少值,有时一棵树连续丢失一年以上,导致有多个连续的NAs

当只有一个连续NA时,使用符合本规范的geom_线可处理跨缺失值的连接:

geom_line(data = df[!is.na(df$y),])
当有一个以上的连续NA(即遗漏2次测量)时,geom_线将不会划过遗漏的数据。应用!对于整个df,is.na不能解决问题,使用geom_路径也不能解决问题

以下是生成复制问题的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)
x
geom_line()
未连接任何缺失数据(NA)。而且
geom_point()
也不会绘制缺失的数据。这是丢失数据的正确默认行为。NA不能放置在数字轴上

您使用
df[!is.na(df$tr2),]
所做的是在将缺少的数据发送到
geom_line()
之前删除这些数据,从而误以为您的数据是完整的。 为了更好地理解这一点,请打印出df[!is.na(df$tr2),c(“x”,“tr2”)]
。这是
geom_line()
接收的数据。显示并连接所有这些数据。该数据中没有NAs,因为您已删除它们

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


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

感谢您运行它来检查cymon。您是对的,“无修复”示例正在处理这个简化示例……不知道为什么昨晚相同的代码没有为我执行此操作。不过,有趣的是,当我在我的大数据集上运行此代码时(即,一次绘制约1000棵树)它似乎无法计算跨已删除NAs的所有线路连接,但当一次将树细分为10-50棵时,绘制效果良好。正如我前面所说,
geom_line()
从不跨NA连接。如果缺少数据,它将中断该位置的行。您在“修复”中所做的是删除缺少数据的行,以便
geom_line()
永远不知道它们的存在。因此,如果在您的大图中出现中断行,这意味着您的数据帧仍然包含丢失的数据。在ggplot之外过滤df,并对过滤后的df运行一些诊断。查找
NA
s、
NULL
s、
NaN
s、
Inf
s……您可能还需要查看
complete.cases(df)
函数,而不是手动筛选所有不同类型的非值。是的,理解并运行了一系列检查。所有的!complete.cases都是NAs,我用上面讨论的代码在geom_行中适当地筛选它们。问题(!!)我应用了一个ylim,它切断了一些点。geom_线不会画出超出图形空间的线,只是不会画出超出轴限制的点的线。为帮助我排除一些问题而干杯
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)