顺序和条件行删除 R
Sequential & conditional row deletion R
我需要删除此数据集中的行,直到 FALSE 中没有 TRUE 或反之亦然,或者按顺序单词所有后续行都相同(是的,边界除外)。行删除的数量应该尽可能少。
例如,通过删除下面数据集中counter == 9的行,将形成更多具有TRUE值的连续行。我希望循环识别计数器中的最低频率值并逐步删除这些行,直到 TRUE 中没有 FALSE,反之亦然。我们还可以删除所有计数器 == 4、5 和 6 的行,因为它们也只出现两次。请注意,在删除这些行后,会形成更大的“块”或“块”的 TRUE 和 FALSE,这应该在以后的删除中考虑。
这是数据集:
inter counter
189 FALSE 1
192 FALSE 1
233 FALSE 1
235 FALSE 1
237 FALSE 1
238 FALSE 1
249 FALSE 1
256 FALSE 1
258 FALSE 1
259 FALSE 1
14 FALSE 1
17 FALSE 1
36 FALSE 1
39 FALSE 1
82 FALSE 1
114 FALSE 1
117 FALSE 1
136 FALSE 1
152 FALSE 1
194 FALSE 1
212 FALSE 1
215 FALSE 1
251 FALSE 1
262 FALSE 1
267 FALSE 1
268 FALSE 1
57 TRUE 2
60 TRUE 2
96 TRUE 2
99 TRUE 2
232 TRUE 2
239 TRUE 2
242 TRUE 2
260 TRUE 2
19 FALSE 3
41 FALSE 3
119 FALSE 3
217 FALSE 3
62 TRUE 4
101 TRUE 4
181 FALSE 5
206 FALSE 5
244 TRUE 6
269 TRUE 6
176 FALSE 7
179 FALSE 7
201 FALSE 7
204 FALSE 7
157 FALSE 7
159 FALSE 7
72 TRUE 8
74 TRUE 8
126 TRUE 8
128 TRUE 8
142 TRUE 8
144 TRUE 8
172 TRUE 8
178 TRUE 8
180 TRUE 8
182 TRUE 8
183 TRUE 8
186 TRUE 8
203 TRUE 8
205 TRUE 8
207 TRUE 8
208 TRUE 8
175 FALSE 9
200 FALSE 9
9 TRUE 10
11 TRUE 10
31 TRUE 10
33 TRUE 10
109 TRUE 10
111 TRUE 10
174 TRUE 10
199 TRUE 10
52 TRUE 10
54 TRUE 10
91 TRUE 10
93 TRUE 10
177 TRUE 10
184 TRUE 10
202 TRUE 10
209 TRUE 10
227 TRUE 10
222 TRUE 10
225 TRUE 10
161 TRUE 10
76 TRUE 10
130 TRUE 10
146 TRUE 10
188 TRUE 10
224 TRUE 10
226 TRUE 10
228 TRUE 10
229 TRUE 10
13 TRUE 10
35 TRUE 10
113 TRUE 10
211 TRUE 10
56 TRUE 10
这是代码。
structure(list(inter = c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE,
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE), counter = c(1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L,
4L, 4L, 5L, 5L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L,
8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 9L, 9L, 10L,
10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L,
10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L,
10L, 10L, 10L, 10L, 10L, 10L)), class = "data.frame", row.names = c(189L,
192L, 233L, 235L, 237L, 238L, 249L, 256L, 258L, 259L, 14L, 17L,
36L, 39L, 82L, 114L, 117L, 136L, 152L, 194L, 212L, 215L, 251L,
262L, 267L, 268L, 57L, 60L, 96L, 99L, 232L, 239L, 242L, 260L,
19L, 41L, 119L, 217L, 62L, 101L, 181L, 206L, 244L, 269L, 176L,
179L, 201L, 204L, 157L, 159L, 72L, 74L, 126L, 128L, 142L, 144L,
172L, 178L, 180L, 182L, 183L, 186L, 203L, 205L, 207L, 208L, 175L,
200L, 9L, 11L, 31L, 33L, 109L, 111L, 174L, 199L, 52L, 54L, 91L,
93L, 177L, 184L, 202L, 209L, 227L, 222L, 225L, 161L, 76L, 130L,
146L, 188L, 224L, 226L, 228L, 229L, 13L, 35L, 113L, 211L, 56L
))
这是一个可能的答案:
library(data.table)
for(i in 1:nrow(dt)) {
if(length(rle(dt$inter)$lengths)>2)
dt$counter<-rleid(dt$inter)
dt<-dt[!dt$counter %in% names(which(table(dt$counter) == min(table(dt$counter)))), ]
dt$counter<-rleid(dt$inter)
if(length(rle(dt$inter)$lengths)==2)
break}
我需要删除此数据集中的行,直到 FALSE 中没有 TRUE 或反之亦然,或者按顺序单词所有后续行都相同(是的,边界除外)。行删除的数量应该尽可能少。
例如,通过删除下面数据集中counter == 9的行,将形成更多具有TRUE值的连续行。我希望循环识别计数器中的最低频率值并逐步删除这些行,直到 TRUE 中没有 FALSE,反之亦然。我们还可以删除所有计数器 == 4、5 和 6 的行,因为它们也只出现两次。请注意,在删除这些行后,会形成更大的“块”或“块”的 TRUE 和 FALSE,这应该在以后的删除中考虑。
这是数据集:
inter counter
189 FALSE 1
192 FALSE 1
233 FALSE 1
235 FALSE 1
237 FALSE 1
238 FALSE 1
249 FALSE 1
256 FALSE 1
258 FALSE 1
259 FALSE 1
14 FALSE 1
17 FALSE 1
36 FALSE 1
39 FALSE 1
82 FALSE 1
114 FALSE 1
117 FALSE 1
136 FALSE 1
152 FALSE 1
194 FALSE 1
212 FALSE 1
215 FALSE 1
251 FALSE 1
262 FALSE 1
267 FALSE 1
268 FALSE 1
57 TRUE 2
60 TRUE 2
96 TRUE 2
99 TRUE 2
232 TRUE 2
239 TRUE 2
242 TRUE 2
260 TRUE 2
19 FALSE 3
41 FALSE 3
119 FALSE 3
217 FALSE 3
62 TRUE 4
101 TRUE 4
181 FALSE 5
206 FALSE 5
244 TRUE 6
269 TRUE 6
176 FALSE 7
179 FALSE 7
201 FALSE 7
204 FALSE 7
157 FALSE 7
159 FALSE 7
72 TRUE 8
74 TRUE 8
126 TRUE 8
128 TRUE 8
142 TRUE 8
144 TRUE 8
172 TRUE 8
178 TRUE 8
180 TRUE 8
182 TRUE 8
183 TRUE 8
186 TRUE 8
203 TRUE 8
205 TRUE 8
207 TRUE 8
208 TRUE 8
175 FALSE 9
200 FALSE 9
9 TRUE 10
11 TRUE 10
31 TRUE 10
33 TRUE 10
109 TRUE 10
111 TRUE 10
174 TRUE 10
199 TRUE 10
52 TRUE 10
54 TRUE 10
91 TRUE 10
93 TRUE 10
177 TRUE 10
184 TRUE 10
202 TRUE 10
209 TRUE 10
227 TRUE 10
222 TRUE 10
225 TRUE 10
161 TRUE 10
76 TRUE 10
130 TRUE 10
146 TRUE 10
188 TRUE 10
224 TRUE 10
226 TRUE 10
228 TRUE 10
229 TRUE 10
13 TRUE 10
35 TRUE 10
113 TRUE 10
211 TRUE 10
56 TRUE 10
这是代码。
structure(list(inter = c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE,
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE), counter = c(1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L,
4L, 4L, 5L, 5L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L,
8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 9L, 9L, 10L,
10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L,
10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L,
10L, 10L, 10L, 10L, 10L, 10L)), class = "data.frame", row.names = c(189L,
192L, 233L, 235L, 237L, 238L, 249L, 256L, 258L, 259L, 14L, 17L,
36L, 39L, 82L, 114L, 117L, 136L, 152L, 194L, 212L, 215L, 251L,
262L, 267L, 268L, 57L, 60L, 96L, 99L, 232L, 239L, 242L, 260L,
19L, 41L, 119L, 217L, 62L, 101L, 181L, 206L, 244L, 269L, 176L,
179L, 201L, 204L, 157L, 159L, 72L, 74L, 126L, 128L, 142L, 144L,
172L, 178L, 180L, 182L, 183L, 186L, 203L, 205L, 207L, 208L, 175L,
200L, 9L, 11L, 31L, 33L, 109L, 111L, 174L, 199L, 52L, 54L, 91L,
93L, 177L, 184L, 202L, 209L, 227L, 222L, 225L, 161L, 76L, 130L,
146L, 188L, 224L, 226L, 228L, 229L, 13L, 35L, 113L, 211L, 56L
))
这是一个可能的答案:
library(data.table)
for(i in 1:nrow(dt)) {
if(length(rle(dt$inter)$lengths)>2)
dt$counter<-rleid(dt$inter)
dt<-dt[!dt$counter %in% names(which(table(dt$counter) == min(table(dt$counter)))), ]
dt$counter<-rleid(dt$inter)
if(length(rle(dt$inter)$lengths)==2)
break}