按列值过滤数据帧的有效方法

时间:2015-11-16 11:28:21

标签: r

我有以下数据帧(DF1),其中包含更多行(这只是数据帧的头部):

"transactionID" "sequenceID" "eventID" "items"
"1" 29698 40928360 1 "OV4"
"2" 23561 41469527 1 "OV6"
"3" 23562 41469527 2 "OV7"
"4" 10514 41487127 1 "OV8"
"5" 10515 41487127 2 "OV9"
"6" 10516 41487127 3 "OV10"
"7" 10517 41487127 4 "OV11"

我想过滤其最大eventID值超过3的所有行。如图所示,每个eventId按sequenceID分组。我想保留行的顺序和内容。 所需的结果将是:

"transactionID" "sequenceID" "eventID" "items"
"4" 10514 41487127 1 "OV8"
"5" 10515 41487127 2 "OV9"
"6" 10516 41487127 3 "OV10"
"7" 10517 41487127 4 "OV11"

因为,只有sequenceID = 41487127包含eventID为4.其余只包含1或2个eventID。 我使用了以下命令:

> data7<-setDT(DF1)[, if(any(eventID >= 3)) .SD, by = sequenceID ]

> data7
   sequenceID transactionID eventID items
1:   41487127         10514       1   OV8
2:   41487127         10515       2   OV9
3:   41487127         10516       3  OV10
4:   41487127         10517       4  OV11

列transactionID的位置已更改。为什么?如何在不更改列位置的情况下过滤数据帧,我该怎么办? 我的命令是否是进行此类过滤的最有效方式?

1 个答案:

答案 0 :(得分:1)

我们按'sequenceID'分组,它成为过滤后的第一列。但是,我们可以使用数据集的原始列名重新排列。

setDT(DF1)[,if(any(eventID>3)) .SD , sequenceID][,names(DF1),with=FALSE]
#   transactionID sequenceID eventID items
#1:         10514   41487127       1   OV8
#2:         10515   41487127       2   OV9
#3:         10516   41487127       3  OV10
#4:         10517   41487127       4  OV11

假设我们需要过滤行的位置,我们使用keep.rownames创建行名列('rn'),然后进行过滤。

setDT(DF1, keep.rownames=TRUE)[, if(any(eventID>3)) .SD , sequenceID
                               ][, names(DF1), with=FALSE]
#   rn transactionID sequenceID eventID items
#1:  4         10514   41487127       1   OV8
#2:  5         10515   41487127       2   OV9
#3:  6         10516   41487127       3  OV10
#4:  7         10517   41487127       4  OV11