【问题标题】:Add rows by group and fill them with zero in R with dplyr按组添加行并使用 dplyr 在 R 中将它们填充为零
【发布时间】:2021-10-18 19:28:30
【问题描述】:

我有一个巨大的数据框,看起来像这样

gene=c("A","A","A","A","B","B")
frequency=c(abs(rnorm(6,0.5,1)))
time=c(1,2,3,4,1,2)
df <- data.frame(gene,frequency,time)

  gene  frequency time
1    A 0.08463914    1
2    A 1.55639512    2
3    A 1.24172246    3
4    A 0.75038980    4
5    B 1.13189855    1
6    B 0.56896895    2

对于基因 B,我只有时间点 1 和 2 的数据。 我想用零填充时间点 3 和 4 的数据,以便我的数据看起来像这样

  gene  frequency time
1    A 0.08463914    1
2    A 1.55639512    2
3    A 1.24172246    3
4    A 0.75038980    4
5    B 1.13189855    1
6    B 0.56896895    2
7    B      0        3
8    B      0        4

总的来说,我有多个组(又名基因)我想为此做这件事。 非常感谢任何帮助或提示。

【问题讨论】:

    标签: r dplyr datatable tidyverse


    【解决方案1】:

    我们可以使用complete

    library(dplyr)
    library(tidyr)
    df %>% 
        complete(gene, time = 1:4, fill = list(frequency = 0)) %>%
        select(names(df))
    

    -输出

    # A tibble: 8 x 3
      gene  frequency  time
      <chr>     <dbl> <dbl>
    1 A         0.590     1
    2 A         0.762     2
    3 A         0.336     3
    4 A         0.437     4
    5 B         0.904     1
    6 B         1.97      2
    7 B         0         3
    8 B         0         4
    

    【讨论】:

      【解决方案2】:

      akrun 的答案是最好的!这是一种旋转方式: 本质上:在旋转过程中产生NA,这些可以被0替换:

      library(tidyr)
      library(dplyr)
      
      df %>% 
          pivot_wider(
              names_from = gene,
              values_from = frequency
          ) %>% 
          pivot_longer(2:3, 
                       names_to = "gene",
                       values_to = "frequency") %>% 
          mutate(frequency = replace_na(frequency, 0)) %>% 
          arrange(gene, time) %>% 
          select(-time, time)
      
        gene  frequency  time
        <chr>     <dbl> <dbl>
      1 A         1.00      1
      2 A         0.413     2
      3 A         0.539     3
      4 A         1.08      4
      5 B         0.473     1
      6 B         1.79      2
      7 B         0         3
      8 B         0         4
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-13
        • 1970-01-01
        • 1970-01-01
        • 2019-04-29
        • 2015-10-13
        • 1970-01-01
        • 2015-12-27
        相关资源
        最近更新 更多