如何用列均值计算 NA,然后将 R 中不同长度的列相乘?

How to compute the NAs with the column mean and then multiply columns of different lengths in R?

我的问题可能不是很清楚,所以我举个例子。

我的最终目标是生产

final=(df1$a*df2$b)+(df1$a*df3$c*df4$d)+(df4$d*df5$e)

我有五个不同长度的数据框(每个一列)如下:

df1

    a
1.  1
2.  2
3.  4
4.  2

df2

    b
1.  2
2.  6

df3

    c
1.  2
2.  4 
3.  3

df4

    d
1.  1
2.  2
3.  4
4.  3

df5

    e
1.  4
2.  6
3.  2

所以我想要一个包含它们的最终数据库,如下所示

finaldf

    a   b   c   d  e
1.  1   2   2   1  4
2.  2   6   4   2  6
3.  4   NA  3   4  2
4.  2   NA  NA  3  NA

我希望每列的所有 NA 都替换为该列的平均值,因此 finaldf 所有列的长度相等:

finaldf

    a   b   c   d   e
1.  1   2   2   1   4
2.  2   6   4   2   6
3.  4   4   3   4   2
4.  2   4   3   3   4

因此我可以得出 final=(df1$a*df2$b)+(df1$a*df3$c*df4$d)+(df4$d*df5$e) as I need.

的最终结果

迄今为止最简单的方法是使用 qpcR、dplyr 和 tidyr 包。

library(dplyr)
library(qpcR)
library(tidyr)

df1 <- data.frame(a=c(1,2,4,2))
df2 <- data.frame(b=c(2,6))
df3 <- data.frame(c=c(2,4,3))
df4 <- data.frame(d=c(1,2,4,3))
df5 <- data.frame(e=c(4,6,2))

mydf <- qpcR:::cbind.na(df1, df2, df3, df4,df5) %>% 
  tidyr::replace_na(.,as.list(colMeans(.,na.rm=T)))

> mydf
  a b c d e
1 1 2 2 1 4
2 2 6 4 2 6
3 4 4 3 4 2
4 2 4 3 3 4

根据您的 rgl 设置,您可能需要 运行 脚本顶部的以下内容以加载 qpcR 程序包(参见 ):

options(rgl.useNULL = TRUE)
library(rgl)

使用 purrr 和 dplyr,我们可以先使用 mget() 将所有数据帧放入一个列表中。其次,使用 set_names 将数据框名称替换为其各自的列名称。第三步,取消列出数据帧以获取 pluck 的向量。然后通过使所有向量相同 length 来添加 NA。 最后,使用 as.data.frame 将所有向量绑定回数据帧,然后使用 mutate 和 ~replace_na 和 colmeans.

library(dplyr)
library(purrr)

mget(ls(pattern = 'df\d')) %>%
        set_names(map_chr(., colnames)) %>%
        map(pluck, 1) %>%
        map(., `length<-`, max(lengths(.))) %>%
        as.data.frame %>%
        mutate(across(everything(), ~replace_na(.x, mean(.x, na.rm=TRUE))))