在 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)
我有一个数据集,每行都有分组的观察结果。但是,我想将每行观察从每个重复的单个观察扩展到一组数量(在本例中为“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)