mutate_all

时间:2019-08-27 19:47:45

标签: dplyr mutate

我有一个由值组成的数据框和一个包含该数据框中每一列的smooth.spline()对象的列表。一些列缺少单个值,我想用关联的样条中的预测值替换那些丢失的值。预测函数的x值将是缺少值的行名。

可复制的示例,原始数据:

df = data.frame(x1 = seq(1,10), x2 = seq(10,1))
rownames(df) = c(1,2,3,5,6,7,8,9,10,11) ##Note the missing value at 4
splines = list()
splines[[1]] = smooth.spline(x = rownames(df), y = df$x1, df = 10)
splines[[2]] = smooth.spline(x = rownames(df), y = df$x2, df = 10)
names(splines) = c('x1','x2')

经过一些数据处理后,我得到以下数据框:

df2 = data.frame(x1 = c(1,2,3,NA,4,5,6,7,8,9,10),
                 x2 = c(10,9,8,NA,7,6,5,4,3,2,1))
rownames(df2) = seq(1:11)
> df2
   x1 x2
1   1 10
2   2  9
3   3  8
4  NA NA
5   4  7
6   5  6
7   6  5
8   7  4
9   8  3
10  9  2
11 10  1

我想使用之前生成的样条曲线预测缺失值,我想它看起来像这样:

df2 = df2 %>%
mutate_all(.funs = (~case_when(is.na(.) ~ predict(splines[[column_name]],
                                                  x = rownames(.))$y,
                               T ~ (.))

但是当使用列名来调用正确的样条列表对象时,我真的不知道如何制作case_。

最终输出应如下所示:

> df2
          x1        x2
1   1.000000 10.000000
2   2.000000  9.000000
3   3.000000  8.000000
4   3.499543  7.500457
5   4.000000  7.000000
6   5.000000  6.000000
7   6.000000  5.000000
8   7.000000  4.000000
9   8.000000  3.000000
10  9.000000  2.000000
11 10.000000  1.000000

This question似乎很接近,但是我不太了解quasure的工作原理如何足以将其转换为我的情况,并且文档并没有那么有用。

0 个答案:

没有答案