计算 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 平均数的主要内容,如果未能解决你的问题,请参考以下文章