2014-11-10 5 views
0

У меня есть столбец data.frame с целями +3000, которые я хотел бы разделить, но они нерегулярны, хотя с рисунком. Вот несколько примеров и то, что я хотел бы, чтобы они были преобразованы в.R Разбиение строк с рисунком нерегулярных длин

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 | P | 120
03988 | C | 3.2
6A | C | 0.905
ADS | P | 56
AX1 | P | 375
BIDU | C | 250
ES | C | 1960
FUR | P | 8

Я думаю, что это охватывает все возможные длины и типы значений для каждой подстроки.

Первый новый столбец должен перезаписать столбец ввода и две другие столбцы должны перезаписать существующие пробелы столбцов в одной и той же data.frame

Другая сложность заключается в том, что есть data.frame строки, которые уже отформатированные правильно, однако является столбцом, который идентифицирует строки, которые не являются. Ниже приведен фрагмент таблицы как .SSV-выход.

enter image description here

Окончательное решение: Это оказалось сложнее, чем предполагалось заменить значения в существующих колоннах, из-за проблем с НС, классов и регистрации номеров строк. Таким образом, я закончил создание временных столбцов и заменил весь столбец, причем этот довольно уродливый и неэффективный способ. Код, предоставленный Анандой Махто, однако работает блестяще.

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 

ответ

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")) 
+0

Спасибо! Мне нужна вторая колонка в столбце PutCall, а третий - в столбце Strike. Который я должен был бы сделать сам теперь, когда у меня есть разделенные ценности. – Marcus

 Смежные вопросы

  • Нет связанных вопросов^_^