Разверните каждую строку с определенным значением в тайдыре

У меня есть набор данных с сгруппированными наблюдениями в строке. Тем не менее, я хотел бы расширить наблюдение за каждой строкой с одного наблюдения на повторение до заданного числа (в данном случае «20» наблюдений каждое).

На прикрепленном изображении введите здесь описание изображения

Каждая реплика представляет собой строку. Я хотел бы расширить каждую строку до 20. Таким образом, «wellA» для «LS x SB» становится расширенным до 20 той же строки. В качестве бонуса я также хотел бы создать новый столбец под названием «Replicate2», в котором будут перечислены числа от 1 до 20, чтобы отразить эти 20 новых строк на реплику.

Идея заключалась в том, чтобы затем добавить статус выживания для каждого человека (отраженный в новых столбцах «Статус» и «Событие»).

Я думаю, что функция «расширить» в tyryr имеет потенциал, но не могу понять, как просто добавить фиксированное число для каждой реплики. Использование столбца «Живой» добавляет переменное количество наблюдений.

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

Любая помощь приветствуется!


person LiveLongandProsper    schedule 29.04.2019    source источник


Ответы (2)


В базе 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))
person Ronak Shah    schedule 29.04.2019

Выполните перекрестное соединение между вашими существующими данными и числами 1:20.

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

Если вы хотите добавить дополнительные столбцы, используйте mutate:

... %>% mutate(status = 1, event = FALSE)
person Gregor Thomas    schedule 30.04.2019