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