【发布时间】:2018-11-20 18:22:23
【问题描述】:
我对以下 data.table 有过滤问题,真的希望有人能帮助我解决这个问题。我不确定是否有一种简单的方法可以做到这一点,并希望要求不要太多。所以这是我的问题:
A B C Area
aa M+H 1 127427
aa M+H 2 204051.5
aa M+Na 1 6855539.48777
aa M+Na 2 6469689
bb M+H 1 15330650
bb M+H 2 214221
bb M+H 3 11357158
bb M+K 1 2140221
bb M+K 2 61715568
对于每组 A B (aa M+H, aa M+Na, bb M+H, bb M+K) 值 C > 1 的所有行,如果其面积值高于该行中的值,则应过滤掉具有相同的 A B 组合和 C 值为 1(每个 A B C 组合在表中仅存在一次)。在该步骤之后,应保留以下行:
A B C Area
aa M+H 1 127427
aa M+Na 1 6855539.48777
aa M+Na 2 6469689
bb M+H 1 15330650
bb M+H 2 214221
bb M+H 3 11357158
bb M+K 1 2140221
然后我想过滤掉所有在同一个 A C 组(aa 1、aa 2、bb 1、bb2)但面积值高于“M+H”行的行作为 B 值。所以应该留下:
A B C Area
aa M+H 1 127427
aa M+Na 2 6469689
bb M+H 1 15330650
bb M+H 2 214221
bb M+H 3 11357158
bb M+K 1 2140221
最后去掉 C 中没有一行值为 1 的所有 A B 组(aa M+H、aa M+Na、bb M+H、bb M+K)。所以应该只有:
A B C Area
aa M+H 1 127427
bb M+H 1 15330650
bb M+H 2 214221
bb M+H 3 11357158
bb M+K 1 2140221
我试图使用 data.table 来完成它,但如果有人告诉我 dplyr 更适合它,我也会很高兴有一个解决方案。无论如何,非常感谢您的时间和精力!
亚塞尔
【问题讨论】:
-
你能澄清一下过滤掉第一个表的规则吗?为什么
bb M+H 2 214221没有被过滤掉?是的,dplyr 非常适合这项任务 -
这里有一些东西可以帮助您入门:
DT[, .SD[!(C>1 & Area > Area[C==1])], by=.(A, B)][, .SD[Area<=Area[B=="M+H"]], by=.(A, C)]
标签: r data.table