计算 r 中数据框列中数值之间的 NaN 平均数

Posted

技术标签:

【中文标题】计算 r 中数据框列中数值之间的 NaN 平均数【英文标题】:Calculate the NaN average number between numeric values in a dataframe column in r 【发布时间】:2021-11-25 21:09:45 【问题描述】:

这是我的数据的样子:

 dput(head(dataf,40))
structure(list(Time = c(20000224, 20000225, 20000226, 20000227, 
20000228, 20000229, 20000301, 20000302, 20000303, 20000304, 20000305, 
20000306, 20000307, 20000308, 20000309, 20000310, 20000311, 20000312, 
20000313, 20000314, 20000315, 20000316, 20000317, 20000318, 20000319, 
20000320, 20000321, 20000322, 20000323, 20000324, 20000325, 20000326, 
20000327, 20000328, 20000329, 20000330, 20000331, 20000401, 20000402, 
20000403), NDVI = c(NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 
NaN, NaN, NaN, NaN, 0.562256741, 0.560792828, 0.559272321, 0.554727235, 
NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0.506596306, 0.504768168, 
0.536223787, 0.5476394, 0.520311992, 0.52862363, NaN, NaN, NaN, 
NaN, NaN, NaN, NaN, NaN, NaN, NaN)), row.names = c(NA, -40L), class = c("tbl_df", 
"tbl", "data.frame"))

我想知道数据框的一列 (NDVI) 中两个数值之间的 NaN 的平均值。

请看下面的例子:

Date NDVI
20000224 NaN
20000225 NaN
20000226 NaN
20000227 NaN
20000228 NaN
20000229 NaN
20000301 NaN
20000302 NaN
20000303 NaN
20000304 NaN
20000305 NaN
20000306 NaN
20000307 NaN
20000308 0.562256741
20000309 0.560792828
20000310 0.559272321
20000311 0.554727235
20000312 NaN
20000313 NaN
20000314 NaN
20000315 NaN
20000316 NaN
20000317 NaN
20000318 NaN
20000319 0.506596306
20000320 0.504768168
20000321 0.536223787
20000322 0.5476394
20000323 0.520311992
20000323 0.52862363

平均值为:

包括最初的 NaN:10 NaN

不包括第一个 NaN:7 NaN

注意,我特意放置了这个数据框,因为它以NaN 开头。我假装的解决方案是在开头包含NaN,因此它将考虑值之间的NaN 的平均值和另一个仅在NaN 之前的第一个数值之后开始计算NaN 的解决方案.

任何帮助将不胜感激。

【问题讨论】:

是的,一个数字(连续 NaN 运行的平均值)。 抱歉,我想说的是,在您的示例数据中,有第三个 10 个连续 NaN 序列,因此平均值为 10 (13 + 7 + 10)/3 或 8.5 (7 + 10) /2... 还是我弄错了?希望下面我的回答对你有帮助 我用我的示例数据做了一个小例子,只是为了展示我假装的两个选项。首先,我希望有一个包含第一个 NaN 的平均值和另一个不包含它们的平均值。是的,你的计算是正确的。 【参考方案1】:
library(dplyr)

dataf %>% 
  group_by(cumsum(!is.na(NDVI))) %>% 
  mutate(cnt = cumsum(is.na(NDVI))) %>% 
  filter(cnt != 0) %>% 
    summarise(consecutive_NaNs = max(cnt)) %>% 
    select(consecutive_NaNs)

返回:

  consecutive_NaNs
             <int>
1               13
2                7
3               10

如果你只想要平均值:

dataf %>% 
group_by(cumsum(!is.na(NDVI))) %>% 
mutate(cnt = cumsum(is.na(NDVI))) %>% 
filter(cnt != 0) %>% 
  summarise(consecutive_NaNs = max(cnt)) %>% 
  select(consecutive_NaNs) %>% 
    summarise(mean_run_length = mean(consecutive_NaNs))

返回:

   mean_run_length
            <dbl>
1              10

附言

如果您使用提供所有运行长度的解决方案,您可以决定是否要包括初始运行......

【讨论】:

以上是关于计算 r 中数据框列中数值之间的 NaN 平均数的主要内容,如果未能解决你的问题,请参考以下文章

如何从连接的数据框列中替换 NaN?

如何在熊猫数据框列中获取 NaN 观察的频率 [重复]

当我在数据框列中有 NaN 时,如何将推文(对象)添加到绘图图表中?

计算R中列中NA的前后值的平均值

根据月份日期列查找数据框列中每个因素的平均值[重复]

具有 nans 的数据框列的移动平均值