2

可用的更大数据集的样本数据集采用以下格式:

Station <-c("A","A","A","A","A","A","A","A","A","A","A","A","A","A","A")
Parameter <-c(2,3,NA,4,4,9,NA,NA,10,15,NA,NA,NA,18,20)
Par_Count <-c(1,1,1,2,2,1,2,2,1,1,3,3,3,1,1)

df<-data.frame(Station, Parameter, Par_Count)
df
Station  Parameter  Par_Count
   A        2          1
   A        3          1
   A        NA         1
   A        4          2
   A        4          2
   A        9          1
   A        NA         2
   A        NA         2
   A        10         1
   A        15         1
   A        NA         3
   A        NA         3
   A        NA         3
   A        18         1
   A        20         1

我想用该列中 NA 的下一个和上一个可用值的平均值来近似数量小于 2 的 NA。在原始数据集中某处 NA 的数量为 100,所以我想忽略连续 NA 的数量大于 3。Par_Count 表示参数中该特定值的连续出现次数。我尝试了: library(zoo) df1 <- within(df, na.approx(df$Parameter, maxgap = 2)) 甚至对于单次出现: df1 <- within(df, Parameter[Parameter == is.na(df$Parameter) & Par_Count == 1] <- lead(Parameter) - lag(Parameter)) 但没有任何效果。它没有改变任何出现的 NA 值。所需的输出如下:

Station  Parameter  Par_Count
       A        2          1
       A        3          1
       A        3.5        1
       A        4          2
       A        4          2
       A        9          1
       A        9.5        2
       A        9.75       2  <--here 9.5 will also work
       A        10         1
       A        15         1
       A        NA         3
       A        NA         3
       A        NA         3
       A        18         1
       A        20         1
4

1 回答 1

2

你快到了。我认为您误解了within. 如果您想在其中使用,您需要将 na.approx 的输出分配给数据框的一列。以下将起作用:

library(zoo)
df1 <- within(df, Parameter <- na.approx(Parameter, maxgap = 2, na.rm = FALSE))

请注意,建议使用 na.rm = FALSE,否则将删除前导或尾随 NA,从而导致错误。

就个人而言,我认为以下内容更具可读性,尽管这是风格问题。

library(zoo)
df1 <- df
df1$Parameter <- na.approx(df$Parameter, maxgap = 2, na.rm = FALSE))
于 2020-01-29T17:57:00.360 回答