在每个特定行满足条件周围选择n行

时间:2016-11-02 20:04:04

标签: r

我有DF

A   B    C
NA  0.1  100
NA  0.2  200
1   0.3  300
NA  0.4  400
NA  0.5  500
1   0.5  600
NA  0.6  700
NA  0.6  800

如果DF$A=1,我需要选择所有行。此外,我需要选择DF$A=1行以下的所有行,以便DF$C-100& DF$C+100 这样输出就是

     A   B    C
    NA  0.2  200
    1   0.3  300
    NA  0.4  400
    NA  0.5  500
    1   0.5  600
    NA  0.6  700

我希望它应该是这样的

if (DF$A==1) print(c(DF[DF$C-100 & DF$C+100, ]))

但当然它不起作用.. 谢谢你的任何线索。

2 个答案:

答案 0 :(得分:1)

您可以首先找到which df$A==1的索引,然后连接所有索引+/- 1

ind <- which(df$A==1)
out <- df[sort(unique(c(ind-1,ind,ind+1))),]
##   A   B   C
##2 NA 0.2 200
##3  1 0.3 300
##4 NA 0.4 400
##5 NA 0.5 500
##6  1 0.5 600
##7 NA 0.6 700

在这里,我们从连接索引中找到所有unique索引,并为子集找到它们sort。如果您真的不关心订单,则无需排序,但unique是处理重叠所必需的。

答案 1 :(得分:1)

我这样做。调用您的数据dd

# select matching C values
matches = dd[!is.na(dd$A), "C", drop = F]
names(matches) = "C_test"  # rename to avoid confusion
result = merge(matches, dd, by = NULL)  # cross join
# filter out bad matches, deduplicate
result = unique(with(result, result[abs(C - C_test) <= 100, ])[-1])

    A   B   C
3  NA 0.2 200
5   1 0.3 300
7  NA 0.4 400
10 NA 0.5 500
12  1 0.5 600
14 NA 0.6 700

正如(我认为)您在评论中指出的,这将忽略原始数据的行顺序,并仅关注C值比较。