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

时间:2019-04-29 23:28:49

标签: r tidyverse tidyr survival

我有一个数据集,每行有分组的观察值。但是,我想将每个行的观测值从每个重复的单个观测值扩展到一个设定的数目(在这种情况下,每个观测值“ 20”个观测值)。

在所附图片中,enter image description here

每个复制都是一行。我想将每一行扩展为20。因此,“ LS x SB”的“ wellA”将扩展为同一行的20。另外,我还想创建一个名为“ Replicate2”的新列,该列以数字形式列出1到20,以反映每个重复的这20个新行。

然后该想法将添加每个人的生存状态(反映在新的“状态”和“事件”列中)。

我认为tidyr中的“扩展”功能具有潜力,但无法弄清楚如何仅为每个重复添加固定数量。使用“活动”列将添加可变数量的观察值。

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

任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:1)

在基数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 :(得分:1)

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

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

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

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