问题描述
我正在处理一个数据帧,其中相同的元素出现多次。在这种情况下,原始事件在第一列中显示为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
的字符串不匹配