以下是我正在处理的数据示例,其中包含两列V1和V2
V1 V2
1 A415Z A415Z 1.010
2 A415J A415Z 0.960
3 B416X A415Z 0.980
4 B416Z A415Z 0.990
5 B416J A415Z 1.020
6 B416M A415Z 1.085
7 B416P A415Z 6.380
8 B416W A415Z 0.995
9 D420R A415Z 0.995
10 D420H A415Z 0.975
11 B416X B416X 0.950
12 B416Z B416X 0.960
13 B416J B416X 0.990
14 B416M B416X 1.055
在第一栏" V1" ,我想删除两个单词以相同字符开头的行。 例如:在第一行,第二行和最后四行中,元素为:A415Z A415Z,A415J A415Z,B416X B416X, B416Z B416X,B416J B416X,B416M B416X。所以输出应该如下所示。
V1 V2
1 B416X A415Z 0.980
2 B416Z A415Z 0.990
3 B416J A415Z 1.020
4 B416M A415Z 1.085
5 B416P A415Z 6.380
6 B416W A415Z 0.995
7 D420R A415Z 0.995
8 D420H A415Z 0.975
如何在这里使用正则表达式? (或)如果有更好的方法建议将有所帮助。
答案 0 :(得分:3)
另一种可能性,使用stringr
包来提取和比较第一个字母
library(stringr)
df[unlist(lapply(str_extract_all(df$V1, '(?<=\\b)([A-z])'), function(i)
length(unique(i)) != 1)),]
# V1 V2
#3 B416X A415Z 0.980
#4 B416Z A415Z 0.990
#5 B416J A415Z 1.020
#6 B416M A415Z 1.085
#7 B416P A415Z 6.380
#8 B416W A415Z 0.995
#9 D420R A415Z 0.995
#10 D420H A415Z 0.975
一个不同的,简化的正则表达式(如@WiktorStribiżew在评论中提到的)将是
str_extract_all(df$V1, '\\b[A-Za-z]')
答案 1 :(得分:2)
使用tidyr:
library(dplyr)
library(tidyr)
df1 %>%
separate(V1, c("V1_1", "V1_2"), remove = FALSE) %>%
mutate(V1_1 = substr(V1_1, 1, 1),
V1_2 = substr(V1_2, 1, 1)) %>%
filter(V1_1 != V1_2) %>%
select(V1, V2)
将第1列分隔为2,然后比较使用子字符串获取第一个字符,并比较它们是否相同以进行过滤。
答案 2 :(得分:2)
或base R
选项是匹配一个或多个数字(\\d+
),后跟一个或多个非空格(\\s+
),后跟零个或多个空格({ {1}}),将其替换为空格(\\s*
),然后匹配重复字符(""
),将其替换为第二个(.)\\1+
中的空格,获取字符数({ {1}}),检查它是否不等于0,即如果有'AA'之类的元素将被删除,而保留gsub
或nchar
的元素则将其分组< / p>
BA
或者只是为了安全
DA