【发布时间】: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