我真的不知道如何通过按组计算周围环境的平均值来填充NAs。换句话说,我不希望其他组的数据以周围平均值计算。
我有一个像这样的股票数据集:
Key | Company_Name | Price |
-- | -------- | -------- |
1 | A | 12 |
2 | A | 13 |
3 | A | 12 |
4 | A | NA |
5 | A | NA |
6 | B | 20 |
7 | B | 21 |
8 | B | NA |
我想通过计算它周围4个环境的平均值来推算这些na。然而,挑战是我不知道如何通过组来完成这个。. 例如,对于第5个观察,我不希望它受到B的价格的影响。
我的期望输出是:
Key | Company_Name | Price |
-- | -------- | -------- |
1 | A | 12 |
2 | A | 13 |
3 | A | 12 |
4 | A | 12.33 |
5 | A | 12.33 |
6 | B | 20 |
7 | B | 21 |
8 | B | 20.5 |
我试图学习的一些链接:
- https://www.statology.org/r-moving-average-by-group/
- https://statisticsglobe.com/replace-na-mean-by-group-r
我已经试过了:
- 没有分组,我使用
ImputeTS
库中的na_ma()
如下所示,它可以工作:
stock$Price = na_ma(stock$Price, k=2, weighting = 'simple')
- 但是当我想将
group_by()
纳入考虑以提高我的imputation精度时,它导致了一个错误:
stock2 = stock %>%
group_by(Company_Name) %>%
mutate(Price = na_ma(stock$Price, k=2, weighting = 'simple'))
mutate()
错误:论证中:Price = na_ma(stock$Price, k=2, weighting = 'simple')
。第1组:Name = "A."
。错误造成的:!Stock
必须是大小76或1,而不是120471。回溯:
- bm_no_na %祝辞% group_by (Company_Name) %祝辞%…
- dplyr::: dplyr_internal_error(…)
如果您想用简单的mean()
函数替换缺失的值:
fill_na <- function(x) ifelse( is.na(x),mean(x, na.rm=T), x)
stock2 <- stock %>%
group_by(Company_Name) %>%
mutate_at(vars("Price") , fill_na)
stock2
Key Company_Name Price
<int> <chr> <dbl>
1 1 A 12
2 2 A 13
3 3 A 12
4 4 A 12.3
5 5 A 12.3
6 6 B 20
7 7 B 21
8 8 B 20.5
或使用ImputeTS
(请注意,正如GuedesBF所提到的,您的代码的问题是避免在dplyr
中使用$
):
library(ImputeTS)
stock2 <- stock %>%
group_by(Company_Name) %>%
mutate(Price = na_ma(Price, k=2, weighting = 'simple'))
stock2
Key Company_Name Price
<int> <chr> <dbl>
1 1 A 12
2 2 A 13
3 3 A 12
4 4 A 12.5
5 5 A 12.5
6 6 B 20
7 7 B 21
8 8 B 20.5
<标题>示例数据stock <- read.table(text = "Key Company_Name Price
1 A 12
2 A 13
3 A 12
4 A NA
5 A NA
6 B 20
7 B 21
8 B NA
",header=T)
标题>