【问题标题】:Derive column from values in another column in the same dataframe从同一数据框中另一列中的值派生列
【发布时间】:2015-08-13 07:49:59
【问题描述】:

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

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

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以使用几种方法来提取子字符串。一种选择是来自library(stringr) 的str_extract。我们使用正则表达式查找匹配一个或多个位于 _ ((?=_)) 之前并跟随另一个 _ ((?<=_)) 的大写字母 ([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"
    

    如果我们已经知道“等级”只有 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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 1970-01-01
      • 1970-01-01
      • 2021-06-29
      相关资源
      最近更新 更多