2014-05-14 70 views
2

以下是我的樣本數據集:當只有一行滿足R中的條件時,如何刪除屬於特定組的所有行?

> dput(lanec) 
structure(list(vehicle.id = c(2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L), frame.id = c(1L, 2L, 3L, 4L, 5L, 3L, 4L, 5L, 6L, 7L, 
8L, 9L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 6L, 7L, 8L, 9L, 10L, 11L, 
12L), lane.change = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 
2L, 1L), .Label = c(".", "yes"), class = "factor")), .Names = c("vehicle.id", 
"frame.id", "lane.change"), class = "data.frame", row.names = c(NA, 
-26L)) 

的第一列是進入高速公路上的一個特定部分車輛的ID。觀察它們直到它們離開該段,因此每輛車具有不同的觀察時間段。幀號在frame.id列中給出。第三欄告訴車輛是否改變車道和車架。 在此示例數據中,除#2號車輛之外的所有車道都改變了車道。車輛#5改變了車道兩次。

要求

我要確定哪些車輛改變車道,並從數據集刪除。我嘗試使用subset(lanec, lane.change!='yes'),但它只刪除lane.change的值爲yes的那些行。使用樣本數據集,期望的輸出應該是:

vehicle.id frame.id lane.change 
1   2  1   . 
2   2  2   . 
3   2  3   . 
4   2  4   . 
5   2  5   . 

我怎樣才能做到這一點?它一定很簡單,但我無法弄清楚。提前致謝。

回答

0

你可以這樣做:

subset(lanec, ave(lane.change != "yes", vehicle.id, FUN = all)) 

爲了幫助理解ave的回報,也許你可以掰成兩步驟:

lanec <- transform(lanec, stays.in.lane = ave(lane.change != "yes", vehicle.id, FUN = all)) 
subset(lanec, stays.in.lane) 

你會看到ave返回矢量沿着lanec的TRUE/FALSE:vehicle.id是否全部(因此使用all)其lane.change值不等於'yes'

+0

或'lanec [有lanec,ave(lane.change!=「yes」,vehicle.id,FUN = all))]''避免使用'subset' – thelatemail

+0

這是一個味道問題,我更喜歡使用'子集'以避免必須兩次寫入'lanec'。我使用的功能也比你少一些,它的可讀性更高,可以爭辯。 – flodel

+0

@ flodel謝謝。有用。但是,你能否解釋一下在後臺發生了什麼?我在幫助中查看了'ave',發現它通過分組變量找到了平均值。有兩件事讓我很困惑:1)我看到你用'FUN'中的'all'替換了'mean',這是什麼意思? 2)'lane.change'是一個因子變量,但是'ave'找到了平均值,它是如何工作的因素? –

0
steady <- names(which(with(lanec, tapply(lane.change, vehicle.id, function(x) all(x=="."))))) 
steady 
[1] "2" 

因此,選擇lane.change中所有項目均爲「。」的onew。

lanec[ lanec$vehicle.id %in% steady, ] 
#------- 

    vehicle.id frame.id lane.change 
1   2  1   . 
2   2  2   . 
3   2  3   . 
4   2  4   . 
5   2  5   . 
相關問題