[英]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.