【问题标题】:How to remove all rows belonging to a particular group when only one row fulfills the condition in R?当只有一行满足 R 中的条件时,如何删除属于特定组的所有行?
【发布时间】:2014-05-14 23:25:38
【问题描述】:

以下是我的示例数据集:

> 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           .

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

【问题讨论】:

    标签: r


    【解决方案1】:

    你可以这样做:

    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' .

    【讨论】:

    • lanec[with(lanec, ave(lane.change != "yes", vehicle.id, FUN = all)),] 避免使用subset
    • 这只是个人喜好问题,我更喜欢使用subset 以避免写两次lanec。我使用的函数也比你少一个,你可以说它更具可读性。
    • @flodel 谢谢。有用。但是您能否也解释一下背景中发生的事情?我查看了帮助中的ave,发现它通过分组变量找到了平均值。这里有两件事让我感到困惑:1)我看到您在FUN 中将mean 替换为all,这是什么意思? 2) lane.change 是一个因子变量,但 ave 找到平均值,它是如何对因子起作用的?
    【解决方案2】:
     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           .
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-16
      • 2016-12-04
      相关资源
      最近更新 更多