我有以下数据帧(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的位置已更改。为什么?如何在不更改列位置的情况下过滤数据帧,我该怎么办? 我的命令是否是进行此类过滤的最有效方式?
答案 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