我有一个大的数据框架(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
这里,^[^-.]*-[^.]*$
匹配不包含点和至少一个连字符的完整字符串。