按组添加行并使用 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
我有一个巨大的数据框,看起来像这样
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