通过选择以特定值开头和结尾的行范围或在特定值之前和之后删除行来设置子集数据集

时间:2013-11-25 20:02:00

标签: 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, 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")

我希望按tag对数据进行分组,但应删除0列中b的第一个和最后一个值的行。我开始尝试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

我该怎么办?

1 个答案:

答案 0 :(得分:1)

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

w <- which(dd$b == 1)
dd[min(w):max(w), ]

通过tag执行此操作:

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