【问题标题】:How to compute the NAs with the column mean and then multiply columns of different lengths in R?如何用列均值计算 NA,然后将 R 中不同长度的列相乘?
【发布时间】:2022-01-17 16:39:00
【问题描述】:

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

我的最终目标是制作

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. 生成最终结果

【问题讨论】:

    标签: r multiple-columns


    【解决方案1】:

    目前最简单的是使用 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 包(请参阅 https://stackoverflow.com/a/66127391/2554330 ):

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

    【讨论】:

    • 效果很好!非常感谢:)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2022-01-12
      • 2021-01-26
      • 2022-11-04
      • 2014-12-03
      • 1970-01-01
      • 2018-10-21
      • 2014-08-09
      • 1970-01-01
      相关资源
      最近更新 更多