当只有一行满足R中的条件时,如何删除属于特定组的所有行?

时间:2014-05-14 23:25:39

标签: 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           .

我怎样才能做到这一点?它必须简单,但我无法弄清楚。提前谢谢。

2 个答案:

答案 0 :(得分:0)

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

所以选择其中lane.change中所有项目都是“。”的那个。

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           .

答案 1 :(得分: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)

您会看到avelanec返回一个TRUE / FALSE向量:vehicle.id是否具有all的全部(lane.change'yes' 1}}值不等于{{1}}。