如何用r中分组的周围均值填充NA



我真的不知道如何通过按组计算周围环境的平均值来填充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     |

我试图学习的一些链接:

  1. https://www.statology.org/r-moving-average-by-group/
  2. 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。回溯:

  1. bm_no_na %祝辞% group_by (Company_Name) %祝辞%…
  2. 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)

相关内容

  • 没有找到相关文章

最新更新