根据元素名称末尾的下划线对数据框进行子集设置

问题描述

我正在处理一个数据帧,其中相同的元素出现多次。在这种情况下,原始事件在第一列中显示为element_1,所有重复出现的元素均显示为element_2,element_3等。 看起来是这样的:

Bear<-c("X03419","X10875_1","X10875_2","X12553","X32463_1","X32463_2","X32463_3")
Year<-c(2007,2008,2018,2005,2007,2008)
Data<-data.frame(Bear,Year)
Data

Bear     Year
X03419   2007
X10875_1 2008
X10875_2 2018
X12553   2005
X32463_1 2007
X32463_2 2005
X32463_3 2008

我想取出所有带有重复元素的行,但保留所有其他行(因此,剩下的唯一内容应该是没有下划线的元素或element_1-类型元素)。

有人知道怎么做吗?

解决方法

我们可以使用grepl来获取行的子集。通过检查是否有一个或多个数字(\\d+)在字符串的末尾(_后接$并否定({{ 1}})返回没有这些情况的行

!

或者如果打算仅删除subset(Data,!grepl('_\\d+$',Bear)) # Bear Year #1 X03419 2007 #4 X12553 2005

_1
,

使用dplyr,我们可以根据包含“ _”的条件进行过滤:

Bear<-c("X03419","X10875_1","X10875_2","X12553","X32463_1","X32463_2","X32463_3")
Year<-c(2007,2008,2018,2005,2007,2008)
Data<-data.frame(Bear,Year)

library(dplyr)

Data = Data %>% 
  dplyr::filter(!grepl('_',Bear))
,

另一种方法

filter_at(Data,vars(Bear),~ !grepl("_(?:1)",Bear))
#       Bear Year
# 1   X03419 2007
# 2 X10875_2 2018
# 3   X12553 2005
# 4 X32463_2 2005
# 5 X32463_3 2008
  • _(?:1):与包含_1的字符串不匹配