按组添加行并使用 dplyr 在 R 中用零填充它们

Add rows by group and fill them with zero in R with dplyr

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

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

总的来说,我想为多个组(又名基因)执行此操作。 非常感谢任何帮助或提示。

我们可以使用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

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