根据R中的特定规则打印模式

时间:2018-03-29 13:04:47

标签: r regex tidyr

我在几个月内没有使用过R,所以一些帮助回来会很棒。下面是我正在使用的示例电子表格。

enter image description here

基本上如果它是一个五个字母数字链,我想要前三个字符。 如果它是一个六个字母数字链,我想跳过第一个字母并获得它后面的三个字符。 如果它是一个四个数字链我只想要前两个数字。

是否可以将它们保存在同一列中并使用逗号开头打印,或者是否需要为每个作业ID创建不同的列?

1 个答案:

答案 0 :(得分:2)

使用例如包含样本数据总是更好dput

您可以将两个嵌套ifelse条件与gsub一起使用。

  1. 以下是一些示例数据。

    # Sample data
    df <- structure(list(JobID = structure(c(1L, 3L, 2L), .Label = c("23D04, 17B51, 1B370",
    "H1B331", "K23D13, 1203, 17B73"), class = "factor")), .Names = "JobID", row.names = c(NA,
    -3L), class = "data.frame");
    df;
    #                JobID
    #1 23D04, 17B51, 1B370
    #2 K23D13, 1203, 17B73
    #3              H1B331
    
  2. JobID上拆分列", "

    # Split column entries on ", "
    lst <- strsplit(as.character(df$JobID), ", ")
    
  3. 提取模式。

    # Extract pattern
    lst <- lapply(lst, function(x) ifelse(
        nchar(x) == 6,
        gsub("^\\w(\\w{3}).+$", "\\1", x),
        ifelse(nchar(x) == 4,
            gsub("^(\\d{2}).+", "\\1", x),
            gsub("^(\\w{3}).+", "\\1", x))));
    
  4. 连接列表条目并存储在新列output中。

    df$output <- sapply(lst, paste0, collapse = ", ")
    #                JobID        output
    #1 23D04, 17B51, 1B370 23D, 17B, 1B3
    #2 K23D13, 1203, 17B73  23D, 12, 17B
    #3              H1B331           1B3