【问题标题】:Deleting/Subsetting Rows in R by setdiff/intersect通过 setdiff/intersect 删除/设置 R 中的行
【发布时间】:2016-05-27 19:28:23
【问题描述】:

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

> 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",]

我尝试了一些不同的选项,包括子集,但到目前为止收效甚微,我认为这将是我的最佳选择。我也在寻找与 intersect 类似的东西,但我假设它会得到类似的答案。

编辑: 除了使用@Cath 提供的代码之外,我还对其进行了编辑以得到相反的结果。

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

【问题讨论】:

  • unsurveyed_1[unsurveyed_1$VEGETATION %in% unique(surveyed_1$VEGETATION), ] 呢?
  • R 中的数据框中没有任何称为deleting 的内容。如@Cath 所述将其子集。
  • 谢谢@Cath。这正是我想要的。

标签: r intersect set-difference


【解决方案1】:

显而易见的是:

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

您使用逻辑向量ID 作为行索引来选择要保留的行。 ID 的每一行都有一个值 TRUE,其中 unsurveyed1$VEGETATION 可以在 surveyed1$VEGETATIONFALSE 中找到,否则。如果您拥有大量数据并且没有太多不同的植被类型,则使用 surveyed1$VEGETATION 中的唯一值只会提高性能。

所以没有必要使用setdiff(),而且更不需要将每个结果复制到新行中。在 R 中工作时,请开始考虑临时对象。这将使您的编程生活变得更加轻松。

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


如果你坚持使用setdiff(),那么打字工作会少很多:

thediff <- setdiff(unsurveyed_1$VEGETATION, surveyed_1$VEGETATION)
ID <- unsurveyed_1$VEGETATION %in% thediff
unsurveyed1 <- unsurveyed1[!ID,]

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

附注:setdiff()%in% 的内部代码几乎完全相同。不同之处在于setdiff() 返回第二个向量中未找到的实际值,而%in% 返回一个逻辑向量,如果在第二个向量中未找到该值,则FALSE

【讨论】:

  • 谢谢。我没有打算使用setdiff()。我最终使用了@Cath 在他们的评论中使用的单行方法。但是当我对相反的子集进行子集时,您对 %in% 运算符的解释非常有帮助。
  • @Southard 不客气。我意识到Cath给你的方法和这个完全一样。我只是用 ID 制作了一个临时向量,但这是个人风格。
  • 是否可以基于多个列来执行此操作?
猜你喜欢
  • 2015-02-05
  • 2019-05-15
  • 2016-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-03
  • 2015-06-13
  • 2012-10-10
相关资源
最近更新 更多