Deleting/Subsetting R 中的行 setdiff/intersect
Deleting/Subsetting Rows in R by setdiff/intersect
我正在尝试从我的数据集中删除包含某些植被类型的行。我想从我的未调查数据中删除那些在我的调查数据中找不到植被类型的行。我找到了一种方法来做到这一点,但我正在寻找一种单线方法。我目前正在这样做:
> setdiff(unsurveyed_1$VEGETATION, surveyed_1$VEGETATION)
然后我删除了 returns 七种植被类型:
> 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), ]
显而易见的是:
ID <- unsurveyed_1$VEGETATION %in% unique(surveyed_1$VEGETATION)
unsurveyed1 <- unsurveyed1[ID,]
您使用逻辑向量 ID
作为行索引 select 您想要保留的行。 ID
的每一行都有一个值 TRUE
,其中 unsurveyed1$VEGETATION
可以在 surveyed1$VEGETATION
中找到,否则可以在 FALSE
中找到。如果您有大量数据并且没有太多不同的植被类型,则使用 surveyed1$VEGETATION
中的唯一值只会提高性能。
因此完全没有必要使用 setdiff()
,更不用说将每个结果复制到新行中了。在 R 中工作时,请开始考虑临时对象。这将使您的编程生活变得更加轻松。
编辑:这正是@Cath 在his/her 单行评论中所做的。
如果您坚持使用setdiff()
,那么这将大大减少打字工作:
thediff <- setdiff(unsurveyed_1$VEGETATION, surveyed_1$VEGETATION)
ID <- unsurveyed_1$VEGETATION %in% thediff
unsurveyed1 <- unsurveyed1[!ID,]
请注意,您必须使用 NOT (!
) 运算符反转 ID
向量,以删除未调查的植被与 thediff
中的值匹配的所有行。
旁注:setdiff()
和%in%
的内部代码几乎完全一样。不同之处在于 setdiff()
returns 在第二个向量中找不到实际值,而 %in%
returns 一个逻辑向量表示 FALSE
如果该值不是在第二个向量中找到。
我正在尝试从我的数据集中删除包含某些植被类型的行。我想从我的未调查数据中删除那些在我的调查数据中找不到植被类型的行。我找到了一种方法来做到这一点,但我正在寻找一种单线方法。我目前正在这样做:
> setdiff(unsurveyed_1$VEGETATION, surveyed_1$VEGETATION)
然后我删除了 returns 七种植被类型:
> 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), ]
显而易见的是:
ID <- unsurveyed_1$VEGETATION %in% unique(surveyed_1$VEGETATION)
unsurveyed1 <- unsurveyed1[ID,]
您使用逻辑向量 ID
作为行索引 select 您想要保留的行。 ID
的每一行都有一个值 TRUE
,其中 unsurveyed1$VEGETATION
可以在 surveyed1$VEGETATION
中找到,否则可以在 FALSE
中找到。如果您有大量数据并且没有太多不同的植被类型,则使用 surveyed1$VEGETATION
中的唯一值只会提高性能。
因此完全没有必要使用 setdiff()
,更不用说将每个结果复制到新行中了。在 R 中工作时,请开始考虑临时对象。这将使您的编程生活变得更加轻松。
编辑:这正是@Cath 在his/her 单行评论中所做的。
如果您坚持使用setdiff()
,那么这将大大减少打字工作:
thediff <- setdiff(unsurveyed_1$VEGETATION, surveyed_1$VEGETATION)
ID <- unsurveyed_1$VEGETATION %in% thediff
unsurveyed1 <- unsurveyed1[!ID,]
请注意,您必须使用 NOT (!
) 运算符反转 ID
向量,以删除未调查的植被与 thediff
中的值匹配的所有行。
旁注:setdiff()
和%in%
的内部代码几乎完全一样。不同之处在于 setdiff()
returns 在第二个向量中找不到实际值,而 %in%
returns 一个逻辑向量表示 FALSE
如果该值不是在第二个向量中找到。