我有一个数据框,上面带有一些物种名称+括号,里面有一个数字+一些文本,如:“ species name(2)V1”,它存在于dataframe $ species_name中。 我需要用gsub删除它,以便它仅返回“物种名称”,而另一个返回“物种名称V1”。 预先感谢!
我已经搜索了一下,至少在R中,没有什么找不到正则表达式模式的。我只能找到删除括号的代码。我太傻了,不知道如何删除其余部分。
答案 0 :(得分:1)
以下两个正则表达式解决了该问题中的两个问题。
s <- "species name(2) V1"
sub("(^[^(]*)\\(.*$", "\\1", s)
#[1] "species name"
sub("\\([^)]*\\)", "", s)
#[1] "species name V1"
现在将它们应用于感兴趣的列。
答案 1 :(得分:1)
因为您提到了gsub()
,所以我认为您想坚持以R为底。
在这里,我根据一些我认为符合您要求的随机产生的物种名称创建了两个新变量。
“(”是一个特殊字符,因此必须以“ \”进行转义,但是由于“ \”本身是一个特殊字符,因此必须以另一个“ \”对其进行转义,从而产生“ \\”。
”。匹配任何一个字符,“ *”是一个表示匹配0或更大的量词。
“ $”表示字符串的结尾。
[0-9]匹配一个整数。
“ +”是表示匹配一个或多个的另一个量词。
因此我们有:
set.seed(42)
df <- data.frame(species_name = paste0("species ",
sample(LETTERS, 10),
" name(",
sample(1:10),
") V",
sample(1:10)))
df$species_name1 <- gsub("\\(.*$", "", df$species_name)
df$species_name2 <- gsub("\\([0-9]*\\)", "", df$species_name)
df
哪个会产生:
species_name species_name1 species_name2
1 species Q name(9) V4 species Q name species Q name V4
2 species E name(5) V5 species E name species E name V5
3 species A name(6) V7 species A name species A name V7
4 species J name(4) V9 species J name species J name V9
5 species D name(2) V8 species D name species D name V8
6 species R name(8) V10 species R name species R name V10
7 species Z name(3) V2 species Z name species Z name V2
8 species O name(7) V3 species O name species O name V3
9 species G name(1) V6 species G name species G name V6
10 species V name(10) V1 species V name species V name V1