我有一个数据帧,我想通过仅选择连续值“1”来对其进行子集化。
具体来说,我有一个如下所示的数据框:
library(tidyverse)
library(zoo)
df <- data.frame(matrix(ncol = 3, nrow = 17))
colnames(df) <- c("row_id","id", "k_yes")
df$row_id <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17)
df$id <- c("1_1","1_1","1_1","1_1","1_1","1_1","1_2","1_2","1_2","1_2","1_2","1_2","1_3","1_3","1_3","1_3","1_3")
df$k_yes <- c(1,1,1,0,1,1,0,0,0,1,1,0,1,0,1,0,1)
df
row_id id k_yes
1 1 1_1 1
2 2 1_1 1
3 3 1_1 1
4 4 1_1 0
5 5 1_1 1
6 6 1_1 1
7 7 1_2 0
8 8 1_2 0
9 9 1_2 0
10 10 1_2 1
11 11 1_2 1
12 12 1_2 0
13 13 1_3 1
14 14 1_3 0
15 15 1_3 1
16 16 1_3 0
17 17 1_3 1
我想创建两个数据集:
1)每组 ( id
) 中只有“1”,但始终有两个或多个连续的。所以,如果两个“1”之间有一个“0”,至少最后一个“1”应该被丢弃。所以它会接受像eg 1-1
,,1-1-1
等等的序列,但不接受0-1-1
or1-1-1-0
然后,我还想添加一列来了解已形成哪个新组/序列,因为它并不总是与 id 相同(如果 id 中有两个子组/序列)。基本上,该列对于整个数据帧的每个序列应该有一个唯一的代码(现在,我只是将 id 与一个字母绑定,但它可以是连续的数字/字母,例如)
这个数据框看起来像这样:
row_id id k_yes new_group
1 1 1_1 1 1_1_A
2 2 1_1 1 1_1_A
3 3 1_1 1 1_1_A
4 5 1_1 1 1_1_B
5 6 1_1 1 1_1_B
6 10 1_2 1 1_2_A
7 11 1_2 1 1_2_A
2)另一种,每组 ( id
) 接受“1”之间有一个“0”,但如果“0”之后没有其他“1”,则不接受。所以它会接受像eg 、、、、1-0-1
等等这样的序列,但不接受像or或或这样的序列(在后面,它只会保留前一个1)。与之前的“new_group”列相同。1-1-0-1
1-1-0-1-1
1-1-0-1-0-1
0-1-1
1-1-0
1-1-0-0-1
df 所需的输出为:
row_id id k_yes new_group
1 1 1_1 1 1_1_A
2 2 1_1 1 1_1_A
3 3 1_1 1 1_1_A
4 4 1_1 0 1_1_A
5 5 1_1 1 1_1_A
6 6 1_1 1 1_1_A
7 10 1_2 1 1_2_A
8 11 1_2 1 1_2_A
9 12 1_3 1 1_3_A
10 14 1_3 0 1_3_A
11 15 1_3 1 1_3_A
12 16 1_3 0 1_3_A
13 17 1_3 1 1_3_A
在本例中,id“1_1”仅获得“新组”(1_1_A) 的一个值,因为它都是相同的序列(包括 0)
我尝试遵循这个答案,但没有成功,因为我尝试过:
> df |>
group_by(id) |>
mutate(b = c(first(k_yes) , zoo::rollsum(k_yes, 1))) |>
summarise(groups_to_keep = id[which(b >= 2)]) -> gk
Error in `mutate()`:
ℹ In argument: `b = c(first(k_yes), zoo::rollsum(k_yes, 1))`.
ℹ In group 1: `id = "1_1"`.
Caused by error:
! `b` must be size 5 or 1, not 6.
我认为问题出在rollsum()
函数上,但是在检查了帮助页面后,我仍然不清楚应该如何应用这个函数。
任何帮助表示赞赏!
更新:
我添加了数据集的新版本,它将在第一个数据集 (1) 中为“新组”创建两个值。
对于数据集#1:
数据集2: