我有一些丰富的数据,用于观察不同日期和地点的昆虫。我想传播数据框,这样我就可以得到每一只昆虫的一行。
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做到这一点?
谢谢你的帮助!
我们可以使用uncount
的tidyr
library(tidyverse)
uncount(df, Abundance) %>%
mutate(Abundance = 1)
你可以使用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)