从同一数据框中另一列中的值派生列

时间:2015-08-13 07:49:59

标签: r

我有一个简单的数据框如下:

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创建一个列,然后将新列粘贴到旧列上。

1 个答案:

答案 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"