R 通过选择以特定值开始和结束的行范围,或删除特定值之前和之后的行来子集数据集

R 通过选择以特定值开始和结束的行范围,或删除特定值之前和之后的行来子集数据集,r,R,我没有发现与我的问题类似的东西,现在我遇到了以下问题: 我有大量数据,因此我创建了一个更简单的数据,您可以使用: structure(list(id = 123:182, tag = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,

我没有发现与我的问题类似的东西,现在我遇到了以下问题: 我有大量数据,因此我创建了一个更简单的数据,您可以使用:

structure(list(id = 123:182, tag = c(1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
3, 3, 3, 3, 3, 3, 3, 3, 3, 3), a = c(3, 3, 5, 9, 1, 9, 9, 5, 
5, 1, 1, 1, 5, 3, 9, 3, 5, 9, 3, 9, 9, 1, 5, 1, 3, 3, 1, 3, 9, 
3, 3, 5, 3, 1, 9, 5, 9, 1, 5, 3, 9, 5, 9, 5, 5, 9, 1, 3, 5, 5, 
3, 9, 3, 1, 1, 1, 3, 5, 5, 3), b = c(0, 0, 0, 0, 1, 1, 0, 0, 
1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 
0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 
1, 0, 1, 1, 1, 1, 0, 0, 0, 0)), .Names = c("id", "tag", "a", 
"b"), row.names = c(NA, -60L), class = "data.frame")
我想按
标记
对数据进行子集划分,但应删除列
b
中第一个和最后一个值为
0
的行。我开始尝试使用
ddplr
-功能,但它不起作用,不值得一看

结果应该是这样的:

     id tag a   b
5   127 1   1   1
6   128 1   9   1
7   129 1   9   0
8   130 1   5   0
9   131 1   5   1
10  132 1   1   0
11  133 1   1   1
12  134 1   1   0
13  135 1   5   1
14  136 1   3   0
15  137 1   9   0
16  138 1   3   1
24  146 2   1   1
25  147 2   3   0
26  148 2   3   1
27  149 2   1   0
28  150 2   3   1
29  151 2   9   1
30  152 2   3   0
31  153 2   3   1
32  154 2   5   0
33  155 2   3   1
34  156 2   1   1
35  157 2   9   1
36  158 2   5   1
45  167 3   5   1
46  168 3   9   1
47  169 3   1   0
48  170 3   3   0
49  171 3   5   1
50  172 3   5   0
51  173 3   3   1
52  174 3   9   0
53  175 3   3   1
54  176 3   1   1
55  177 3   1   1
56  178 3   1   1

我能做什么?

如果您的数据框是
dd
,请尝试以下操作:

w <- which(dd$b == 1)
dd[min(w):max(w), ]
is.ok <- function(b.ok) {
   if (any(b.ok)) {
        w <- which(b.ok)
        seq_along(b.ok) %in% min(w):max(w) 
    } else FALSE
}
ok <- ave(dd$b == 1, dd$tag, FUN = is.ok)
dd[ok, ]

更新:通过
tag
如果
dd
是您的数据帧,请尝试以下操作:

w <- which(dd$b == 1)
dd[min(w):max(w), ]
is.ok <- function(b.ok) {
   if (any(b.ok)) {
        w <- which(b.ok)
        seq_along(b.ok) %in% min(w):max(w) 
    } else FALSE
}
ok <- ave(dd$b == 1, dd$tag, FUN = is.ok)
dd[ok, ]

更新:通过
tag

是的,谢谢,通过@G.Grothendiek,我检查了以下代码,最后它给出了正确的结果(很抱歉使用注释,作为初学者,我不允许回答我自己的问题):
selecttest是的,谢谢,通过@G.Grothendiek,我检查了以下代码,最后它给出了正确的结果(很抱歉使用了这些注释,作为初学者,我不允许回答自己的问题):
selecttest