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

标签 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 并粘贴,但我不知道如何基于 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/

相关文章:

r - 在一个数据框上,如果它们存在于另一个数据框上,则重复值

删除 lapply 中的循环

arrays - 如何将数组缩放到另一个长度,保存 R 中的近似值

r - 两个 geom_bar() 和因子变量的错误顺序

r - 如何用R代码编织一个Rmd文件生成一个word文档

r - 在 Ubuntu 中安装 R 包以更正库路径

r - 如何在 knitr 生成的 PDF 中实现黑白友好的语法高亮显示

r - 预测glmnet中概率的函数错误?

r - 在 R 中查找具有模式的列的最大值/最小值

r - 在 R 线性模型中,仅获取交互系数的 p 值