如何计算剧集的长度及其在 R 中的序号
How do I calculate the length of an episode and it's sequential number in R
我正在使用一个数据框,其中我有动物在房间里四处走动的顺序时间数据。我有一个列表示动物何时不动(isImmobile = TRUE 或 FALSE),我想创建一个新列来显示不动情节的持续时间 - 在下面的示例中它将是 3 帧 - 所以我可以排除那些太短了。
我还想包括一个列,它可以告诉我固定剧集的数量。
这是一些示例数据:
time speed zone animal group week distance period isImmobile
1 5.26 73.8 interzone ctrl5 ctrl 0 50.3 p1 FALSE
2 5.29 70.8 interzone ctrl5 ctrl 0 1.30 p1 FALSE
3 5.33 70 interzone ctrl5 ctrl 0 1.40 p1 TRUE
4 5.36 56.3 interzone ctrl5 ctrl 0 1.98 p1 TRUE
5 5.39 51.7 interzone ctrl5 ctrl 0 2.70 p1 TRUE
6 5.43 47 interzone ctrl5 ctrl 0 1.84 p1 FALSE
我要找的是这样的:
time speed zone animal group week distance period isImmobile Ep_number Ep _Duration
1 5.26 73.8 interzone ctrl5 ctrl 0 50.3 p1 FALSE NA NA
2 5.29 70.8 interzone ctrl5 ctrl 0 1.30 p1 FALSE NA NA
3 5.33 70 interzone ctrl5 ctrl 0 1.40 p1 TRUE 1 3
4 5.36 56.3 interzone ctrl5 ctrl 0 1.98 p1 TRUE 1 3
5 5.39 51.7 interzone ctrl5 ctrl 0 2.70 p1 TRUE 1 3
6 5.43 47 interzone ctrl5 ctrl 0 1.84 p1 FALSE NA NA
框架也可以完全省略 isImmobile = FALSE 而不是 NA 时的剧集。
最好是dplyr,其他的也不错:)
在此先感谢您。我也希望类似的问题还没有被问到 - 我找不到任何东西。
这是 data.table
的一种方法 - 在 'isImmobile' 列上使用 rleid
创建一个 run-length-encoding 列,然后使用 'grp' 作为分组列,并指定 i
中的逻辑列,我们分配两个具有组索引 (.GRP
) 和行数 (.N
)
的新列
library(data.table)
setDT(df1)[, grp := rleid(isImmobile)]
df1[as.logical(isImmobile), c("Ep_number", "Ep_duration") :=
.(.GRP, .N), grp][, grp := NULL][]
-输出
> time speed zone animal group week distance period isImmobile Ep_number Ep_duration
<num> <num> <char> <char> <char> <int> <num> <char> <lgcl> <int> <int>
1: 5.26 73.8 interzone ctrl5 ctrl 0 50.30 p1 FALSE NA NA
2: 5.29 70.8 interzone ctrl5 ctrl 0 1.30 p1 FALSE NA NA
3: 5.33 70.0 interzone ctrl5 ctrl 0 1.40 p1 TRUE 1 3
4: 5.36 56.3 interzone ctrl5 ctrl 0 1.98 p1 TRUE 1 3
5: 5.39 51.7 interzone ctrl5 ctrl 0 2.70 p1 TRUE 1 3
6: 5.43 47.0 interzone ctrl5 ctrl 0 1.84 p1 FALSE NA NA
或使用 base R
和 rle
cbind(df1, with(rle(df1$isImmobile),
data.frame(Ep_number = rep((NA^!values) * seq_len(values[values]), lengths),
Ep_duration = rep((NA^!values) * lengths, lengths))))
数据
df1 <- structure(list(time = c(5.26, 5.29, 5.33, 5.36, 5.39, 5.43),
speed = c(73.8, 70.8, 70, 56.3, 51.7, 47), zone = c("interzone",
"interzone", "interzone", "interzone", "interzone", "interzone"
), animal = c("ctrl5", "ctrl5", "ctrl5", "ctrl5", "ctrl5",
"ctrl5"), group = c("ctrl", "ctrl", "ctrl", "ctrl", "ctrl",
"ctrl"), week = c(0L, 0L, 0L, 0L, 0L, 0L), distance = c(50.3,
1.3, 1.4, 1.98, 2.7, 1.84), period = c("p1", "p1", "p1",
"p1", "p1", "p1"), isImmobile = c(FALSE, FALSE, TRUE, TRUE,
TRUE, FALSE)), class = "data.frame", row.names = c("1", "2",
"3", "4", "5", "6"))
我正在使用一个数据框,其中我有动物在房间里四处走动的顺序时间数据。我有一个列表示动物何时不动(isImmobile = TRUE 或 FALSE),我想创建一个新列来显示不动情节的持续时间 - 在下面的示例中它将是 3 帧 - 所以我可以排除那些太短了。
我还想包括一个列,它可以告诉我固定剧集的数量。
这是一些示例数据:
time speed zone animal group week distance period isImmobile
1 5.26 73.8 interzone ctrl5 ctrl 0 50.3 p1 FALSE
2 5.29 70.8 interzone ctrl5 ctrl 0 1.30 p1 FALSE
3 5.33 70 interzone ctrl5 ctrl 0 1.40 p1 TRUE
4 5.36 56.3 interzone ctrl5 ctrl 0 1.98 p1 TRUE
5 5.39 51.7 interzone ctrl5 ctrl 0 2.70 p1 TRUE
6 5.43 47 interzone ctrl5 ctrl 0 1.84 p1 FALSE
我要找的是这样的:
time speed zone animal group week distance period isImmobile Ep_number Ep _Duration
1 5.26 73.8 interzone ctrl5 ctrl 0 50.3 p1 FALSE NA NA
2 5.29 70.8 interzone ctrl5 ctrl 0 1.30 p1 FALSE NA NA
3 5.33 70 interzone ctrl5 ctrl 0 1.40 p1 TRUE 1 3
4 5.36 56.3 interzone ctrl5 ctrl 0 1.98 p1 TRUE 1 3
5 5.39 51.7 interzone ctrl5 ctrl 0 2.70 p1 TRUE 1 3
6 5.43 47 interzone ctrl5 ctrl 0 1.84 p1 FALSE NA NA
框架也可以完全省略 isImmobile = FALSE 而不是 NA 时的剧集。
最好是dplyr,其他的也不错:)
在此先感谢您。我也希望类似的问题还没有被问到 - 我找不到任何东西。
这是 data.table
的一种方法 - 在 'isImmobile' 列上使用 rleid
创建一个 run-length-encoding 列,然后使用 'grp' 作为分组列,并指定 i
中的逻辑列,我们分配两个具有组索引 (.GRP
) 和行数 (.N
)
library(data.table)
setDT(df1)[, grp := rleid(isImmobile)]
df1[as.logical(isImmobile), c("Ep_number", "Ep_duration") :=
.(.GRP, .N), grp][, grp := NULL][]
-输出
> time speed zone animal group week distance period isImmobile Ep_number Ep_duration
<num> <num> <char> <char> <char> <int> <num> <char> <lgcl> <int> <int>
1: 5.26 73.8 interzone ctrl5 ctrl 0 50.30 p1 FALSE NA NA
2: 5.29 70.8 interzone ctrl5 ctrl 0 1.30 p1 FALSE NA NA
3: 5.33 70.0 interzone ctrl5 ctrl 0 1.40 p1 TRUE 1 3
4: 5.36 56.3 interzone ctrl5 ctrl 0 1.98 p1 TRUE 1 3
5: 5.39 51.7 interzone ctrl5 ctrl 0 2.70 p1 TRUE 1 3
6: 5.43 47.0 interzone ctrl5 ctrl 0 1.84 p1 FALSE NA NA
或使用 base R
和 rle
cbind(df1, with(rle(df1$isImmobile),
data.frame(Ep_number = rep((NA^!values) * seq_len(values[values]), lengths),
Ep_duration = rep((NA^!values) * lengths, lengths))))
数据
df1 <- structure(list(time = c(5.26, 5.29, 5.33, 5.36, 5.39, 5.43),
speed = c(73.8, 70.8, 70, 56.3, 51.7, 47), zone = c("interzone",
"interzone", "interzone", "interzone", "interzone", "interzone"
), animal = c("ctrl5", "ctrl5", "ctrl5", "ctrl5", "ctrl5",
"ctrl5"), group = c("ctrl", "ctrl", "ctrl", "ctrl", "ctrl",
"ctrl"), week = c(0L, 0L, 0L, 0L, 0L, 0L), distance = c(50.3,
1.3, 1.4, 1.98, 2.7, 1.84), period = c("p1", "p1", "p1",
"p1", "p1", "p1"), isImmobile = c(FALSE, FALSE, TRUE, TRUE,
TRUE, FALSE)), class = "data.frame", row.names = c("1", "2",
"3", "4", "5", "6"))