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