查找r中只有破折号或句号的字符



我有一个大的数据框架(70k行乘200k列),其中一些行名有破折号,一些有句号,一些两者兼而有之,像这样:

df <- data.frame(cell1 = c(0,1,2,3,4,5,6), cell2 = c(0,1,2,3,4,5,6))
rownames(df) <- c("CMP21-97G8.1", "RP11-34P13.7", "HLA.A", "HLA-A", "HLA-E", "HLA.E", "RP11.442N24--B.1")
cell1 cell2
CMP21-97G8.1         0     0
RP11-34P13.7         1     1
HLA.A                2     2
HLA-A                3     3
HLA-E                4     4
HLA.E                5     5
RP11.442N24--B.1     6     6

我想创建三个df子组,其中一个子组的行名只有句号(HLA.A/HLA.E),一个子组的行名只有破破号(HLA-A/HLA-E),另一个子组的行名两者都有(CMP21-97G8.1/RP11-34P13.7/RP11.442N24--B.1)。像这样:

df1
cell1 cell2
CMP21-97G8.1         0     0
RP11-34P13.7         1     1
RP11.442N24--B.1     6     6
df2
cell1 cell2
HLA.A                2     2
HLA.E                5     5
df3
cell1 cell2
HLA-A                3     3
HLA-E                4     4

当我尝试查找句号和破折号时,它们似乎总是"懒惰",就像,它只是查看它是否有句号或破折号,而不会歧视两者都有的情况。

#looking for either or. Returns all types mentioned
df <- df[grepl("[-]|[.]",rownames(df)),]
#tries to look for only containing both. Returns all types mentioned
df <- df[grepl("[^-]*-([^.]+).*",rownames(df)),]
#returns nothing
df <- df[grepl("[-]&[.]",rownames(df)),]
df <- df[grepl("[-]&&[.]",rownames(df)),]

希望这是有意义的,感谢阅读!

您可以使用以下命令获取第一个数据帧:

df1 <- df[grepl("-[^.]*\.|\.[^-]*-",rownames(df)),]

输出:

> df1
cell1 cell2
CMP21-97G8.1         0     0
RP11-34P13.7         1     1
RP11.442N24--B.1     6     6

-[^.]*\.|\.[^-]*-正则表达式匹配两个子字符串,-.之间的字符串或.-之间的字符串。

第二个数据帧可以用:

df2 <- df[grepl("^[^-.]*\.[^-]*$", rownames(df)),]

这里,^[^-.]*.[^-]*$匹配不包含连字符和至少一个点的完整字符串。

查看输出:

> df2
cell1 cell2
HLA.A     2     2
HLA.E     5     5

和下面的代码来得到第三个数据帧:

df3 <- df[grepl("^[^-.]*-[^.]*$", rownames(df)),]

查看输出:

> df3
cell1 cell2
HLA-A     3     3
HLA-E     4     4

这里,^[^-.]*-[^.]*$匹配不包含点和至少一个连字符的完整字符串。

相关内容

  • 没有找到相关文章

最新更新