R-用固定类别非零值的平均值替换零值

R-用固定类别非零值的平均值替换零值,r,dataframe,replace,R,Dataframe,Replace,我得到了以下形式的数据集 year<-rep(c(1990:1999),each=10) age<-rep(50:59, 10) cat1<-rep(c("A","B","C","D","E"),each=100) value<-rnorm(10*10*5) value[c(3,51,100,340,441)]<-0 df<-data.frame(year,age,cat1,value) year age cat1 value 1 1990

我得到了以下形式的数据集

year<-rep(c(1990:1999),each=10) 
age<-rep(50:59, 10)
cat1<-rep(c("A","B","C","D","E"),each=100)
value<-rnorm(10*10*5)
value[c(3,51,100,340,441)]<-0
df<-data.frame(year,age,cat1,value)

  year age  cat1     value
1 1990  50    A -0.7941799
2 1990  51    A  0.1592270
3 1990  52    A  0.0000000
4 1990  53    A  1.9222384  
5 1990  54    A  0.3922259
6 1990  55    A -1.2671957
我们将用替换条目0

sum(df[df$year==1990 & df$age==52,4])/4
[1] -0.4735654

一般来说,有没有一种好的、干净的方法?

可能99.9%的表操作可以分解为基本的快速和优化操作:拆分、串联(数字的情况下):求和、乘法等、过滤、排序、连接

这里是从dplyr加入的左路。 只需创建另一个从零过滤出来的数据帧,并通过适当的分组聚合到值上。然后用新联接列中的值替换零

library(data.table)
setDT(df)[value==0, value := NA,]
df[, value := replace(value, is.na(value), mean(value, na.rm = TRUE)) , by = .(year, age)]
library(data.table)
setDT(df)[value==0, value := NA,]
df[, value := replace(value, is.na(value), mean(value, na.rm = TRUE)) , by = .(year, age)]