【问题标题】:Print a Pattern based on specific rules in R [closed]根据 R 中的特定规则打印模式 [关闭]
【发布时间】:2018-03-29 13:04:46
【问题描述】:

我已经有几个月没有使用 R 语言了,所以如果能帮助我重新使用 R 语言会很棒。下面是我正在使用的示例电子表格。

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

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

【问题讨论】:

  • 可以将它们保持在同一列中,只要它们被列出。但是,如果每个 Job ID 有不同的列,它的计算速度会更快。祝你好运!

标签: r regex tidyr


【解决方案1】:

使用例如包含示例数据总是更好。 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
    

【讨论】:

  • 我已经尝试过了,谢谢。如果我想在新列中打印结果而不是替换旧列,代码会有所不同吗?另外,我想对具有数万个观察值的整个专栏进行此操作。
  • @Alex 我已经更新了我的答案,请看一下。这将适用于相关列中的任意数量的条目。
  • 感谢您的快速响应。我先在我的电脑上用样本数据试试,然后去公司电脑上。
猜你喜欢
  • 2017-06-11
  • 2010-09-28
  • 1970-01-01
  • 2012-10-30
  • 2015-02-28
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多