如何用列均值计算 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))))
我的问题可能不是很清楚,所以我举个例子。
我的最终目标是生产
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))))