删除某些条件的行

时间:2017-05-05 09:27:20

标签: r regex

以下是我正在处理的数据示例,其中包含两列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

如何在这里使用正则表达式? (或)如果有更好的方法建议将有所帮助。

3 个答案:

答案 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'之类的元素将被删除,而保留gsubnchar的元素则将其分组< / p>

BA

或者只是为了安全

DA