使用R中的plot()缺失数据:我应该使用na.omit(),!is.na(),approx()?如果是这样,那么是如何做到的?

xxls0lw8  于 2023-06-19  发布在  其他
关注(0)|答案(2)|浏览(114)

问题

我有三个变量随时间变化的记录。第一个(黑色)在每个时间段记录,第二个(蓝色)每隔一个时间段记录,第三个(红色)在除一个时间段之外的每个时间段记录。我试着在R中绘制这些:

test <- data.frame(time=c(1:5), black=c(3, 3, 3, 3, 3), blue=c(1, NA, 3, NA, 5), red=c(5, 4, NA, 2, 1))

plot(test$time, test$black, type="l", col="black")
lines(test$time, test$blue, col="blue")
lines(test$time, test$red, col="red")

结果是一个图,其中“黑色”是唯一的连续线,“蓝色”完全不存在,并且“红色”在时间2和时间4之间不存在。我希望这三条线都是连续的。

尝试的解决方案

How to connect dots where there are missing values?

plot(na.omit(test), test$time, test$black, type="l", col="black")

返回“match.fun(panel)中的错误:'test$black'不是函数、字符或符号”。

na.omit(test)
plot(test$time, test$black, type="l", col="black")
lines(test$time, test$blue, col="blue")
lines(test$time, test$red, col="red")

图与我原来的问题相同,实际上省略了其中一个变量缺失数据的每个时间段,因此实际数据(在本例中,对于黑色)与其他变量缺失数据的每个时间段一起被省略。
How to I draw a line plot and ignore missing values in R

plot(type="l", test$time, test$black, col="black")
lines(which(!is.na(test$blue)), na.omit(test$blue), test$time, test$blue, col="blue")
lines(test$time, test$red, col="red")

返回“错误在plot.xy(xy.coords(x,y),type = type,...):无效的绘图类型“”。即使将第一行修改为plot(test$time, test$black, col="black")也不能解决此错误。
How to connect dots where there are missing values?

plot(approx(test, xout=seq_along(test))$y, type="l", test$time, test$black, col="black")

返回“xy.coords(x,y,xlabel,ylabel,log)中的错误:'x'和'y'长度不同”。
关于R - Plotting a line with missing NA values
有评论说,na.omit()或na.approx()“似乎只有当我在一个独立的图中单独绘制'A'时才能工作,它们似乎不能与'时间'和'B'和'C'一起工作,所有这些都在同一个图中 ”,这是一个“ 超级奇怪的bug”。他们建议:

plot(test$time[!is.na(test$black)],test$black[!is.na(test$black)],type="l")
lines(test$time,test$blue, type="l",col="blue")
lines(test$time, test$red, type="l", col="red")

情节和我原来的问题一样。如果我将'blue'的编码更改为(test$time, test$blue, type="p", col="blue"),那么我在时间点3得到一个点,但不是我期望的线。
关于R - Plotting a line with missing NA values

xlim <- range(test$time)
ylim <- range(subset[-1], na.rm = TRUE)

快速返回“Error in subset[-1]:类型为“closure”的对象不可作为子对象。

ok <- ! is.na(test$black)
plot(black ~ time, time, time = ok, type = "l", xlim = xlim, ylim = ylim)

快速返回“Error in FUN(Xi,...):类型“闭包”的“envir”参数无效。我也看不出“蓝色”或“红色”数据如何进入这个图,即使它没有返回错误。
那么,当其中一个变量有缺失数据时,有没有办法使用plot()来绘制多个变量随时间的变化?

uinbv5nw

uinbv5nw1#

如果你想在数据缺失的时候把这些点连接起来,你可以使用library(zoo)

install.packages('zoo')
library(zoo)

# Create the data frame
test <- data.frame(time = 1:5, black = c(3, 3, 3, 3, 3), blue = c(1, NA, 3, NA, 5), red = c(5, 4, NA, 2, 1))

# Interpolate missing values
test$blue <- na.approx(test$blue)
test$red <- na.approx(test$red)

# Plot the data
plot(test$time, test$black, type = "l", col = "black", ylim = range(na.omit(test[-1])))
lines(test$time, test$blue, col = "blue")
lines(test$time, test$red, col = "red")

ccrfmcuu

ccrfmcuu2#

使用approx插值每个y轴向量。要绘制插值结果,首先打开一个空图,然后使用mapply循环将每个列和线的颜色传递给插值和绘制代码。

test <- data.frame(time = 1:5, 
                   black = c(3, 3, 3, 3, 3), 
                   blue = c(1, NA, 3, NA, 5), 
                   red = c(5, 4, NA, 2, 1))

clrs <- names(test)[-1]
xlim <- range(test$time)
ylim <- range(test[-1], na.rm = TRUE)
plot(NA, NA, type = "n", xlim = xlim, ylim = ylim)
mapply(\(y, col) {
  dat <- approx(x = test$time, y)
  lines(y ~ x, data = dat, col = col)
}, test[-1], clrs)

#> $black
#> NULL
#> 
#> $blue
#> NULL
#> 
#> $red
#> NULL

创建于2023-06-15,使用reprex v2.0.2

相关问题