R 中位数替换,需要数字数据

R 中位数替换,需要数字数据,r,na,median,imputation,R,Na,Median,Imputation,我试图根据一个组来估算缺失的值。我得到一个错误,中值函数需要数字数据,但我所有的数据都是数字,所以我看不到问题。这是一个可重复性最低的示例 set.seed(123) cluster = sample(seq(1,10),1000,replace=TRUE) V1 = sample(c(runif(100),NA),1000,replace=TRUE) V2 = sample(c(runif(100),NA),1000,replace=TRUE) df = as.data.frame(cbin

我试图根据一个组来估算缺失的值。我得到一个错误,中值函数需要数字数据,但我所有的数据都是数字,所以我看不到问题。这是一个可重复性最低的示例

set.seed(123)
cluster = sample(seq(1,10),1000,replace=TRUE)
V1 = sample(c(runif(100),NA),1000,replace=TRUE)
V2 = sample(c(runif(100),NA),1000,replace=TRUE)

df = as.data.frame(cbind(cluster,V1,V2))

df_fixed = by(df,df$cluster,function(x){replace(x,is.na(x),median(x, na.rm=TRUE))})
返回的错误:

median.defaultx中的错误,na.rm=TRUE:需要数字数据

不过,这段代码可以工作,所以问题在于中值函数

df_fixed = by(df,df$cluster,function(x){replace(x,is.na(x),1)})

请在使用诸如runif、sample等函数时使用set.seed,以使其具有可复制性。通过将df切割成小数据帧,这不是类数字。你想用列式中位数还是整体中位数来替换?我正在尝试按组替换每个列式中位数。因此,如果在第1组中缺少,则替换为第1组的中值。当所有组中都缺少值时,此代码有效。由于某种原因,在我的实际数据中,当存在没有缺失值的组时,不会替换任何内容。它只是跳过这些列。我无法用虚拟数据重现这一点,所以除非你有什么想法,否则我必须想出一个解决方案?@user137698我更改了代码。现在,它也适用于没有缺失值的列。试着让我知道。
df_fixed <- apply(df[,2:3], 2, function(x) {
  md <- sapply(sort(unique(df$cluster)), function(k) median(x[df$cluster==k], na.rm=TRUE)) 
  x[is.na(x)] <- md[df$cluster][is.na(x)]
  return(x)
})  

any(is.na(df_fixed))
# [1] FALSE