我有一个简单的数据框如下:
Name Number
4332.Dys_FSe_20PCent_HGD_fq.gz 8
4332.Dys_FSe_10PCent_LGD_fq.gz 2
4332.Dys_FSe_LGD_fq.gz 1
4332.GoodDy_10PCent_HGD_.fq.gz 1
4332.GoodDy_LessThan10PCent_HGD_.fq.gz 1
4332.GoodDy_10PCent_HGD_.fq.gz 1
4332.GoodDy_10PCent_HGD_.fq.gz 1
4332.GoodDy_15PCent_HGD_.fq.gz 1
4332.GoodDy_10PCent_HGD_.fq.gz 1
4332.GoodDys_15PCent_HGD_.fq.gz 4
我想提取子字符串HGD或LGD并将其放在另一个名为Grade的列中,以便得到结果:
Name Number Grade
4332.Dys_FSe_20PCent_HGD_fq.gz 8 HGD
4332.Dys_FSe_10PCent_LGD_fq.gz 2 LGD
4332.Dys_FSe_LGD_fq.gz 1 LGD
4332.GoodDy_10PCent_HGD_.fq.gz 1 HGD
4332.GoodDy_LessThan10PCent_HGD_.fq.gz 1 HGD
4332.GoodDy_10PCent_HGD_.fq.gz 1 HGD
4332.GoodDy_10PCent_HGD_.fq.gz 1 HGD
4332.GoodDy_15PCent_HGD_.fq.gz 1 HGD
4332.GoodDy_10PCent_HGD_.fq.gz 1 HGD
4332.GoodDys_15PCent_HGD_.fq.gz 4 HGD
我想我在这里使用grep和paste但我不知道如何根据grep创建一个列,然后将新列粘贴到旧列上。
答案 0 :(得分:2)
我们可以使用几种方法来提取子字符串。一个选项是来自str_extract
的{{1}}。我们匹配library(stringr)
([A-Z]+
)之前的一个或多个大写字母(_
),并使用正则表达式查找并提取另一个(?=_)
(_
)那个匹配的人物。
(?<=_)
如果我们已经知道等级&#39;将只有3个字符,没有其他3个字母的大写字母,下面也应该工作
library(stringr)
df1$Grade <- str_extract(df1$Name, '(?<=_)[A-Z]+(?=_)')
df1$Grade
#[1] "HGD" "LGD" "LGD" "HGD" "HGD" "HGD" "HGD" "HGD" "HGD" "HGD"
或者使用str_extract(df1$Name, '[A-Z]{3}')
#[1] "HGD" "LGD" "LGD" "HGD" "HGD" "HGD" "HGD" "HGD" "HGD" "HGD"
,我们匹配大写字母并将它们作为一组进行匹配,方法是将它们放在括号中(sub
),并在替换参数中使用`\ 1&#39;得到那个子串。
(A-Z]{3})
sub('.*_([A-Z]{3,})_.*$', '\\1', df1$Name)
#[1] "HGD" "LGD" "LGD" "HGD" "HGD" "HGD" "HGD" "HGD" "HGD" "HGD"