【问题标题】:NAs introduced by coercion with plot function R使用绘图函数 R 强制引入的 NA
【发布时间】:2021-12-26 13:59:30
【问题描述】:

我正在尝试用 x 轴上的年月和 y 轴上的温度来绘制我的数据。我有几年没有任何可用数据,因此是 NA。当我绘制数据时,我收到错误消息“强制引入的 NA”。我之前对另一个数据(也对 NAs)做了同样的事情并且它有效,所以我不确定我做错了什么。

这是一个可重现的例子:

df <- read.table(header=TRUE, text="
Year_month Temperature
1937-04 NA
1937-05 NA 
1937-06 NA 
1937-07 NA
1938-04 -2.3
1938-05 11.8
1938-06 2.5
1938-07 -1.2
1939-04 NA
1939-05 NA
1939-06 NA
1939-07 NA
1940-04 -2.3
1940-05 -9.3
1940-06 8.5
1940-07 5.6
")  



df$Year_Month <- format(df$Year_Month,format ="%Y-%m")


plot(df$Year_Month, df$Temperature, type="l", col="red", lwd=2,
     xlab="Jahr", ylab="Durchschnittstemperatur [°C]", ylim=c(-10,15), xlim=c(1930,1940))

感谢您的帮助!

【问题讨论】:

  • plot(Temperature ~ Year_Month, data=df[complete.cases(df),], ...)?
  • Funktioniert leider auch nicht,gleiche 错误消息

标签: r plot


【解决方案1】:

问题实际上是您的数据。您尝试在年月之外创建日期的尝试有些失败。你不能format 一个字符串,可能是为了格式化一个日期。

让我们首先将每个月的第一天 pasteing "-01" 发送到 "Year_Month" 并创建一个日期列。

df <- transform(df, Date=as.Date(paste0(Year_Month, '-01')))

现在,由于适当的"Date" 类,R 可以正确识别新列中的日期。它使用各自的plot 方法,并且可以正常工作。

plot(Temperature ~ Date, df, col="red", lwd=2, ylim=c(-10, 15), 
     xlab="Jahr", ylab="Durchschnittstemperatur [°C]")

但是,您可能希望将年月作为 x-labels。我们不能采用"Year_Month" 列,因为它有间隙,所以我们将sequences 设为最小和最大日期,即range,并增加"month"。由于此序列也属于"Date" 类,因此它们被正确分配给适当的日期。为了一个干净的轴,我们可能只想在每 5 个标签上进行子集化,我们可以用模 %% 5 来做。

dat_sq <- do.call(seq, c(as.list(range(df$Date)), 'month'))
dat_5 <- (seq_along(dat_sq) + 4) %% 5 == 0

plot(Temperature ~ Date, df, col="red", lwd=2, ylim=c(-10, 15), 
     xlab="Jahr", ylab="Durchschnittstemperatur [°C]", xaxt='n')
axis(1, dat_sq, labels=FALSE)
mtext(substr(dat_sq, 1, 7)[dat_5], 1, 1, at=dat_sq[dat_5], cex=.9)

看起来信息量更大。

很多新命令,但你会适应 :)


数据:

df <- structure(list(Year_Month = c("1937-04", "1937-05", "1937-06", 
"1937-07", "1938-04", "1938-05", "1938-06", "1938-07", "1939-04", 
"1939-05", "1939-06", "1939-07", "1940-04", "1940-05", "1940-06", 
"1940-07"), Temperature = c(NA, NA, NA, NA, -2.3, 11.8, 2.5, 
-1.2, NA, NA, NA, NA, -2.3, -9.3, 8.5, 5.6)), class = "data.frame", row.names = c(NA, 
-16L))

【讨论】:

  • 谢谢,这行得通!但是是否也有可能包括有 NA 并且 R 只是没有放点的年份?显示这些年份已包含在数据中会很有趣,但没有任何数据...
  • @natash 请查看更新后的答案。
猜你喜欢
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
  • 2019-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-21
  • 2021-03-12
相关资源
最近更新 更多