R 如何在数据帧中找到重复的数字序列
假设我有下一个数据帧,我想做的是识别并删除某些观察结果 我们的想法是删除那些具有4个或更多类似数字的观察结果R 如何在数据帧中找到重复的数字序列,r,dataframe,sequence,R,Dataframe,Sequence,假设我有下一个数据帧,我想做的是识别并删除某些观察结果 我们的想法是删除那些具有4个或更多类似数字的观察结果 df<-data.frame(col1=c(12,34,233,3333,3333333,333333,555555,543,456,87,4,111111,1111111111,22,222,2222,22222,9111111,912,8688888888)) col1 1 12 2 34 3 233 4
df<-data.frame(col1=c(12,34,233,3333,3333333,333333,555555,543,456,87,4,111111,1111111111,22,222,2222,22222,9111111,912,8688888888))
col1
1 12
2 34
3 233
4 3333
5 3333333
6 333333
7 555555
8 543
9 456
10 87
11 4
12 111111
13 1111111111
14 22
15 222
16 2222
17 22222
18 9111111
19 912
20 8688888888
虽然不是最有效的方法,但它似乎返回了期望的结果。将向量转换为字符串,拆分每个字符,使用
rle
查找重复序列,取最大值,如果最大值小于4,则返回TRUE
df[sapply(strsplit(as.character(df$col1), ""),
function(x) max(rle(x)$lengths) < 4), , drop=FALSE]
col1
1 12
2 34
3 233
8 543
9 456
10 87
11 4
14 22
15 222
19 912
df[sapply(strsplit)(如.character(df$col1),“”),
函数(x)最大值(rle(x)$长度)<4,drop=FALSE]
可乐
1 12
2 34
3 233
8 543
9 456
10 87
11 4
14 22
15 222
19 912
此方法将包括像155155这样的值,但不包括像555511或155551这样的值。删除所需值的另一种方法是在将数字转换为字符后使用
grep()
直接过滤1111
、2222
等
df$col1[-as.numeric(grep(paste(1111*(1:9), collapse="|"), as.character(df$col1), value=F))]
# [1] 12 34 233 543 456 87 4 22 222 912
为什么不是简单的
表格
而不是rle
?我想这取决于OP想要的是一个数字的总数还是重复序列(例如155155)。我选择了后者,但是表格
(或表格
)对于前者的解释会更好。澄清点:155155应该被包括还是被排除?应该被包括构建一个正则表达式。好电话。请注意,grep
有一个倒过来的参数,可以用来代替-
。另外,grepl
在这里是一个自然的替代品。为了好玩,这里有一个替代品:df$col1[!grepl(paste0((1:9),“{4}”,collapse=“|”)as.character(df$col1))]
。
df$col1[-as.numeric(grep(paste(1111*(1:9), collapse="|"), as.character(df$col1), value=F))]
# [1] 12 34 233 543 456 87 4 22 222 912