簡體   English   中英

如何用列均值計算 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 package 加載(請參閱https://stackoverflow.com/a/66127391/2554330 ):

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

使用 purrr 和 dplyr,我們可以首先使用 mget() 將所有數據幀放入一個列表中。 其次,使用set_names將 dataframe 名稱替換為其各自的列名稱。 第三步,使用pluck取消列出數據幀以獲取向量。 然后通過使所有向量的length相同來添加 NA。 最后,使用as.data.frame將所有向量綁定回 dataframe,然后使用mutate和 ~replace_na 和 colmeans。

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))))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM