以下是我的样本数据集:
> 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 :(得分: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)
您会看到ave
向lanec
返回一个TRUE / FALSE向量:vehicle.id
是否具有all
的全部(lane.change
)'yes'
1}}值不等于{{1}}。