根据 R 中其他行因子的子集(使用中位数作为估计值)替换数据框中 NA 的最有效方法

Most efficient way to replace NAs in a data frame based on a subset of other row factors (using median as an estimate) in R

我想根据给定其他因素的相同变量的中值来估计数据框中数值变量的值。然后我想用这些估计值替换数值变量的 NA。

我有这样一个数据框:

Fac1   Fac2   Var1
A      a      20
A      b      30
B      a      5
B      b      10
.
.
.

我使用聚合函数为每个因素组合找到了这些中位数:

A a = 22
A b = 28
B a = 12
B b = 8

因此,Var1 中的任何 NA 都将根据因素的组合替换为相应的中位数。

我知道这可以通过单独替换每个数据子集的缺失值来完成,但是考虑到两个以上的因素,这很快就会变得乏味。 我想知道是否有一些更有效的方法来获得这个结果。

您没有提供示例数据,但根据您的问题,我认为这应该可行。

如@Roland 所述,无需单独计算 median

假设您的数据框为 df。对于每个组(此处 Fac1Fac2),我们计算移除 NA 值的中位数。此外,我们 select 仅具有 NA 值的指数,并将其替换为其组中值。

df$Var1[is.na(df$Var1)] <- ave(df$Var1,df$Fac1, df$Fac2, FUN=function(x) 
                                  median(x, na.rm = T)[is.na(df$Var1)]

更新

根据 OP 的要求添加一些关于 ave 功能的信息。

ave中的第一个参数是您要对其进行任何操作的参数。所以这里的第一个参数是 Var1,我们要为其找到 median。后面的所有其他参数都是分组变量。它可以是任何数字。这里的分组变量是 Fac1Fac2。现在是我们要为我们在分组变量中定义的每个组(Fac1Fac2)应用我们的第一个参数(Var1)的函数。因此,对于每个独特的组,我们在这里找到该组的 median