【问题标题】:R Splitting strings with pattern of irregular lengthsR用不规则长度的模式分割字符串
【发布时间】:2015-01-06 19:18:18
【问题描述】:

我有一个包含 +3000 个字符串的 data.frame 列,我想将其分开,但它们是不规则的,尽管有模式。以下是一些示例,以及我希望它们转换成的内容。

00700/Z14P120:xhkg
03988/Z14C3.2:xhkg
6A/F15C0.905:xcme
ADS/X14P56:xeur
AX1/X14P375:xams
BIDU/28X14C250:xcbf
ES/F15C1960:xcme
FUR/M16P8:xams

00700 |磷 | 120
03988 | C | 3.2
6A | C | 0.905
广告 |磷 | 56
AX1 |磷 | 375
百度 | C | 250
西式 | C | 1960
毛皮 |磷 | 8

我认为这涵盖了每个子字符串的所有可能长度和值类型。

第一个新列应覆盖输入列,其他两列应覆盖同一 data.frame 中现有的列空白

另一个复杂情况是,有一些 data.frame 行已经被正确格式化,但是有一个列标识了那些没有被正确格式化的行。下面是表格的一部分,作为 .CSV 输出。

最终解决方案: 由于 NA、类和行号注册的问题,替换现有列中的值比预期的要困难得多。因此,我最终以这种相当丑陋和低效的方式创建了临时列并替换了整个列。 然而,Ananda Mahto 提供的代码确实运行良好。

ETO <- as.array(data_results$InstrumentSymbolCode)
ETO <- do.call(rbind, 
        strsplit(gsub("(.*)/[A-Z0-9]+?([A-Z])([0-9\\.-]+)?:.*", 
                      "\\1NONSENSESPLIT\\2NONSENSESPLIT\\3", ETO),
                "NONSENSESPLIT", fixed = TRUE))
ETO[data_results$ProductCategoryID!=9] <- ""

temp1 <- array(0,nrow(ETO))
temp2 <- array(0,nrow(ETO))
temp3 <- array(0,nrow(ETO))
for (i in 1:nrow(ETO)){
  if (data_results$ProductCategoryID[i]==9) {
    temp1[i] <- ETO[i,1]
    temp2[i] <- ETO[i,2]
    temp3[i] <- ETO[i,3]
  }  else {
    temp1[i] <- as.character(data_results$InstrumentSymbolCode[i])
    temp2[i] <- as.character(data_results$PutCall[i])
    temp3[i] <- data_results$Strike[i]
  }
}
data_results$InstrumentSymbolCode<-as.character(temp1)
data_results$PutCall <- temp2
data_results$Strike <- temp3

【问题讨论】:

    标签: r string replace substring strsplit


    【解决方案1】:

    您可以将一些正则表达式与strsplit 一起使用,可能是这样的:

    do.call(rbind, 
            strsplit(gsub("(.*)/[A-Z0-9]+?([A-Z])([0-9\\.-]+)?:.*", 
                          "\\1NONSENSESPLIT\\2NONSENSESPLIT\\3", mydf$v1),
                     "NONSENSESPLIT", fixed = TRUE))
    #      [,1]    [,2] [,3]   
    # [1,] "00700" "P"  "120"  
    # [2,] "03988" "C"  "3.2"  
    # [3,] "6A"    "C"  "0.905"
    # [4,] "ADS"   "P"  "56"   
    # [5,] "AX1"   "P"  "375"  
    # [6,] "BIDU"  "C"  "250"  
    # [7,] "ES"    "C"  "1960" 
    # [8,] "FUR"   "P"  "8"    
    

    不过,尚不清楚您希望在哪里/如何替换原始数据中的这些值。


    样本数据:

    mydf <- data.frame(v1 = c("00700/Z14P120:xhkg", "03988/Z14C3.2:xhkg",
      "6A/F15C0.905:xcme", "ADS/X14P56:xeur", "AX1/X14P375:xams",
      "BIDU/28X14C250:xcbf", "ES/F15C1960:xcme", "FUR/M16P8:xams"))
    

    【讨论】:

    • 谢谢!我希望第二列进入 PutCall 列,第三列进入 Strike 列。既然我有分离的价值观,我应该可以自己做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多