我有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, ]))
但当然它不起作用.. 谢谢你的任何线索。
答案 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
值比较。