У меня есть некоторые данные об изобилии для наблюдений за насекомыми в разные даты и в разных местах. И я хочу распространить фрейм данных, чтобы получить по одной строке для каждого отдельного наблюдаемого насекомого.
set.seed(1234)
df <- expand.grid(factor = c("A", "B"),
date = seq(as.Date("2019-05-04"), as.Date("2019-05-08"),"day"))
df$Abundance <- sample(seq(3,10,1), nrow(df), replace = T)
Что у меня есть:
factor date Abundance
1 A 2019-05-04 3
2 B 2019-05-04 7
3 A 2019-05-05 7
4 B 2019-05-05 7
5 A 2019-05-06 9
6 B 2019-05-06 8
7 A 2019-05-07 3
8 B 2019-05-07 4
9 A 2019-05-08 8
10 B 2019-05-08 7
И теперь я хочу преобразовать фрейм данных, чтобы он выглядел так:
factor date Abundance
1 A 2019-05-04 1
2 A 2019-05-04 1
3 A 2019-05-04 1
4 B 2019-05-04 1
5 B 2019-05-04 1
6 B 2019-05-04 1
7 B 2019-05-04 1
8 B 2019-05-04 1
9 B 2019-05-04 1
10 B 2019-05-04 1
...
Кто-нибудь знает, как это сделать с помощью dplyr?
Спасибо за вашу помощь!
Вы можете использовать rep
и slice
, где мы повторяем каждую строку Abundance
количество раз.
library(dplyr)
df %>%
slice(rep(1:n(), Abundance)) %>%
mutate(Abundance = 1)
# factor date Abundance
#1 A 2019-05-04 1
#2 A 2019-05-04 1
#3 A 2019-05-04 1
#4 B 2019-05-04 1
#5 B 2019-05-04 1
#6 B 2019-05-04 1
#7 B 2019-05-04 1
#8 B 2019-05-04 1
#9 B 2019-05-04 1
#10 B 2019-05-04 1
#....
То же самое с использованием базы R будет
transform(df[rep(1:nrow(df), df$Abundance), ], Abundance = 1)
Мы можем использовать uncount
из tidyr
library(tidyverse)
uncount(df, Abundance) %>%
mutate(Abundance = 1)
Смотрите
?tidyr::uncount