我正在尝试删除包含某些植被类型的数据集中的行。我想从我的调查数据中未找到植被类型的未经调查的数据中删除行。我找到了一种方法,但我正在寻找一种单线方法。我目前正在这样做:
> 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), ]
答案 0 :(得分:3)
显而易见的是:
ID <- unsurveyed_1$VEGETATION %in% unique(surveyed_1$VEGETATION)
unsurveyed1 <- unsurveyed1[ID,]
使用逻辑向量ID
作为行索引来选择要保留的行。对于ID
中TRUE
和unsurveyed1$VEGETATION
可以找到surveyed1$VEGETATION
的每一行,FALSE
的值为surveyed1$VEGETATION
。如果您拥有大量数据而不是太多不同的植被类型,则使用setdiff()
中的唯一值只会提高性能。
因此无需使用setdiff()
,并且更不需要在新行中复制每个结果。在R中工作时,请从临时对象开始思考。这将使您的编程生活变得更加轻松。
如果您坚持使用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;
。