在 tidyr 中用特定值展开每一行

Expand each row with specific value in tidyr

我有一个数据集,每行都有分组的观察结果。但是,我想将每行观察从每个重复的单个观察扩展到一组数量(在本例中为“20”个观察)。

在附图中,

每个副本都是一行。我想将每一行扩展到 20。因此 "wellA" for "LS x SB" 变成扩展到同一行的 20。作为奖励,我还想创建一个名为 "Replicate2" 的新列,以数字方式列出 1 到 20,以反映每个复制的这 20 个新行。

然后添加每个个体的生存状态(反映在新列 "Status" 和 "Event" 中)。

我认为 tidyr 中的 "expand" 函数具有潜力,但无法弄清楚如何为每个复制添加固定数量。使用 "Alive" 列是在添加可变数量的观察值。

expand<-DF %>% expand(nesting(Date, Time, Cumulative.hrs, Timepoint, Treatment, Boat, Parentage, Well, Mom, Dad, Cone, NumParents, Parents), Alive)

感谢任何帮助!

在 base R 中,我们可以使用 rep 重复行和 transform 添加新列

n <- 20
transform(df[rep(seq_len(nrow(df)), each = n), ], Replicate = 1:n, row.names = NULL)

使用 n = 3

的可重现示例
df <- data.frame(a = 1:3, b = 4:6, c = 7:9)
n <- 3
transform(df[rep(seq_len(nrow(df)), each = n), ], Replicate = 1:n, row.names = NULL)

#  a b c Replicate2
#1 1 4 7         1
#2 1 4 7         2
#3 1 4 7         3
#4 2 5 8         1
#5 2 5 8         2
#6 2 5 8         3
#7 3 6 9         1
#8 3 6 9         2
#9 3 6 9         3

使用 dplyr 我们可以使用 slice 重复行和 mutate 添加新列。

library(dplyr)

df %>%
  slice(rep(seq_len(n()), each = n)) %>%
  mutate(Replicate2 = rep(seq_len(n), n))

在现有数据和数字 1:20 之间进行交叉连接。

tidyr::crossing(DF, replicate2 = 1:20)

如果要添加其他列,请使用 mutate:

... %>% mutate(status = 1, event = FALSE)