通过setdiff / intersect删除/子集R中的行

时间:2016-02-16 13:27:11

标签: r machine-learning intersect set-difference

我正在尝试删除包含某些植被类型的数据集中的行。我想从我的调查数据中未找到植被类型的未经调查的数据中删除行。我找到了一种方法,但我正在寻找一种单线方法。我目前正在这样做:

> setdiff(unsurveyed_1$VEGETATION, surveyed_1$VEGETATION)

返回七种植被类型,然后我将其删除:

> unsurveyed_1 <- unsurveyed_1[!unsurveyed_1$VEGETATION == "Acer rubrum- Nyssa sylvatica saturated forest alliance",]
> unsurveyed_1 <- unsurveyed_1[!unsurveyed_1$VEGETATION == "Acer rubrum/Quercus coccinea-Acer rubrum-Vaccinium corybosum-Vaccinium palladium",]
> unsurveyed_1 <- unsurveyed_1[!unsurveyed_1$VEGETATION == "Building",]
> unsurveyed_1 <- unsurveyed_1[!unsurveyed_1$VEGETATION == "Parking Lot",]
> unsurveyed_1 <- unsurveyed_1[!unsurveyed_1$VEGETATION == "Prunus serotina",]
> unsurveyed_1 <- unsurveyed_1[!unsurveyed_1$VEGETATION == "Typha (angustifolia, latifolia) - (Schoenoplectus spp.) Eastern Herbaceous Vegetation",]
> unsurveyed_1 <- unsurveyed_1[!unsurveyed_1$VEGETATION == "Water",]

我尝试了一些不同的选项,包括子集,但到目前为止还没有成功,这将是我最好的选择。我也期待与相似的东西,但我假设它会有类似的答案。

编辑: 除了使用@Cath提供的代码之外,我还编辑了它以获得相反的代码。

> unsurveyed_2 <- unsurveyed_2[unsurveyed_2$VEGETATION %in% setdiff(unsurveyed_2$VEGETATION, surveyed_1$VEGETATION), ]

1 个答案:

答案 0 :(得分:3)

显而易见的是:

ID <- unsurveyed_1$VEGETATION %in% unique(surveyed_1$VEGETATION)
unsurveyed1 <- unsurveyed1[ID,]

使用逻辑向量ID作为行索引来选择要保留的行。对于IDTRUEunsurveyed1$VEGETATION可以找到surveyed1$VEGETATION的每一行,FALSE的值为surveyed1$VEGETATION。如果您拥有大量数据而不是太多不同的植被类型,则使用setdiff()中的唯一值只会提高性能。

因此无需使用setdiff(),并且更不需要在新行中复制每个结果。在R中工作时,请从临时对象开始思考。这将使您的编程生活变得更加轻松。

编辑:这正是@Cath在他/她的评论中所做的一切。

如果您坚持使用thediff <- setdiff(unsurveyed_1$VEGETATION, surveyed_1$VEGETATION) ID <- unsurveyed_1$VEGETATION %in% thediff unsurveyed1 <- unsurveyed1[!ID,] ,那么输入工作就会少得多:

ID

请注意,您必须使用NOT(!)运算符反转thediff向量,以删除未经调查的植被与setdiff()中的值匹配的所有行。

旁注:%in%setdiff()的内部代码几乎完全相同。不同之处在于%in%会返回第二个向量中找不到的实际值,FALSE会返回一个逻辑向量,如果在第二个向量中找不到值,则会返回header('Location: http://www.yoursite.com/signUp.php'); exit;