我有一个简单的数据框,如下所示:
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 并粘贴,但我不知道如何基于 grep 创建一列,然后将新列粘贴到旧列上。
最佳答案
我们可以使用多种方法来提取子字符串。一种选择是str_extract
来自library(stringr)
。我们匹配 [A-Z]+
前面的一个或多个大写字母 ( _
) ( (?=_)
) 并跟随另一个 _
( (?<=_)
) 使用正则表达式查找并提取匹配的字符。
library(stringr)
df1$Grade <- str_extract(df1$Name, '(?<=_)[A-Z]+(?=_)')
df1$Grade
#[1] "HGD" "LGD" "LGD" "HGD" "HGD" "HGD" "HGD" "HGD" "HGD" "HGD"
如果我们已经知道“Grade”只有 3 个字符,并且没有其他 3 个字母的大写字母,则以下内容也应该有效
str_extract(df1$Name, '[A-Z]{3}')
#[1] "HGD" "LGD" "LGD" "HGD" "HGD" "HGD" "HGD" "HGD" "HGD" "HGD"
或者使用sub
,我们匹配大写字母并通过将它们放在括号( (A-Z]{3})
)中捕获作为一个组,并在替换参数中使用“\1”来获取该子字符串。
sub('.*_([A-Z]{3,})_.*$', '\\1', df1$Name)
#[1] "HGD" "LGD" "LGD" "HGD" "HGD" "HGD" "HGD" "HGD" "HGD" "HGD"
数据
df1 <- structure(list(Name = c("4332.Dys_FSe_20PCent_HGD_fq.gz",
"4332.Dys_FSe_10PCent_LGD_fq.gz",
"4332.Dys_FSe_LGD_fq.gz", "4332.GoodDy_10PCent_HGD_.fq.gz",
"4332.GoodDy_LessThan10PCent_HGD_.fq.gz",
"4332.GoodDy_10PCent_HGD_.fq.gz", "4332.GoodDy_10PCent_HGD_.fq.gz",
"4332.GoodDy_15PCent_HGD_.fq.gz", "4332.GoodDy_10PCent_HGD_.fq.gz",
"4332.GoodDys_15PCent_HGD_.fq.gz"), Number = c(8L, 2L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 4L)), .Names = c("Name", "Number"),
class = "data.frame", row.names = c(NA, -10L))
关于r - 从同一数据框中另一列的值派生列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31982466/